开发者

XslTransform with xml-stylesheet

It looks like everyone says if you use XslTransform, you would call Load to load the style sheet first, then call Transform to transform it. However I have the follow开发者_StackOverflowing XML file:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="some_stylesheet.xsl" ?>
....
</xml>

Am I suppose to load the xml first, find the style sheet node, then call Load to load the style sheet, or is there another way to do it?


<? ... ?> are processing instructions (PI), so <?xml-stylesheet ... ?> is a hint how to transform your xml. But that does not happen automatically. Interpretation of those instructions depend on the processor. What to do with this information depends on your requirements:

You could load your xml via XmlDocument, XDocument, ... and the PI will be ignored. You can do with your xml what ever you want: Use it as it is, transform it via any xsl transformation of your choice or retrieve the href-Attribute of the PI and use that transformation.

To come back to your original question: If you want your xml to be transformed by the given XSLT, then the workflow is as you expected it:

  • Load xml
  • Retrieve href to xslt transformation
  • Load xslt
  • Transform xml via xslt


You are loading source xml, loading xslt and apply one to another There is limited native XSLT2 support in .NET so i recomend using AltovaXML library altova xml, usage can be found there altova xml online documentaion

XSLT 2.0 transformation (XML to XML)

// Specify folder (AltovaXMLExamples folder)
// Check if filepath is correct for you
String strExamplesFolder = Environment.GetEnvironmentVariable("ProgramFiles") +   
"\\Altova\\AltovaXML2011\\AltovaXMLExamples\\";

// Create a new AltovaXML instance and access its engines
Altova.AltovaXML.Application AltovaXML = new Altova.AltovaXML.Application();

// Use XSLT2 Engine of AltovaXML to transform simple.xml using CopyInputXSLT2.xsl
Altova.AltovaXML.IXSLT2 AltovaXMLXSLT2 = AltovaXML.XSLT2;
 AltovaXMLXSLT2.InputXMLFileName = strExamplesFolder + "simple.xml";
 AltovaXMLXSLT2.XSLFileName = strExamplesFolder + "CopyInputXSLT2.xsl";
AltovaXMLXSLT2.Execute(strExamplesFolder + "simpleOutputFromXML.xml");

XSLT 2.0 transformation (String to XML)

// Specify folder (AltovaXMLExamples folder)
// Check if filepath is correct for you
String strExamplesFolder = Environment.GetEnvironmentVariable("ProgramFiles") + 
    "\\Altova\\AltovaXML2011\\AltovaXMLExamples\\";

// Create a new AltovaXML instance and access its engines
Altova.AltovaXML.Application AltovaXML = new Altova.AltovaXML.Application();

// Use XSLT2 Engine of AltovaXML to transform input string using CopyInputXSLT2.xsl
Altova.AltovaXML.IXSLT2 AltovaXMLXSLT2 = AltovaXML.XSLT2;
 AltovaXMLXSLT2.InputXMLFromText = "<?xml version='1.0'?><doc>Hello World</doc>";
 AltovaXMLXSLT2.XSLFileName = strExamplesFolder + "CopyInputXSLT2.xsl";
AltovaXMLXSLT2.Execute(strExamplesFolder + "simpleOutputFromString.xml");

XSLT 2.0 transformation (String to String)

// Specify folder (AltovaXMLExamples folder)
// Check if filepath is correct for you
String strExamplesFolder = Environment.GetEnvironmentVariable("ProgramFiles") +     
    "\\Altova\\AltovaXML2011\\AltovaXMLExamples\\";

// Create a new AltovaXML instance and access its engines
Altova.AltovaXML.Application AltovaXML = new Altova.AltovaXML.Application();

// Use XSLT2 Engine of AltovaXML to transform input string using CopyInputXSLT2.xsl
Altova.AltovaXML.IXSLT2 AltovaXMLXSLT2 = AltovaXML.XSLT2;
AltovaXMLXSLT2.InputXMLFromText = "<?xml version='1.0'?><doc>Hello World</doc>";
AltovaXMLXSLT2.XSLFileName = strExamplesFolder + "CopyInputXSLT2.xsl";
String strResult = AltovaXMLXSLT2.ExecuteAndGetResultAsString();

// Show result
MessageBox.Show("XSLT 2.0 engine answered: " + strResult);


Implementing the xml-stylesheet processing instruction is up to the user agent. The .NET XML library isn't a user agent, your program is. So yes, you're going to have to look at this processing instruction and load the XSLT yourself.

If you need to handle this PI in all of its glory, you should definitely look at the W3C recommendation. The PI can contain more than just a reference to a stylesheet (i.e. the pseudo-attributes). This may be important if the documents you're processing use every aspect of the PI.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜