XslTransform与xml-stylesheet

时间:2011-08-25 21:27:04

标签: c# xml xslt

看起来每个人都说如果你使用XslTransform,你会先调用Load来加载样式表,然后调用Transform来转换它。但是,我有以下XML文件:

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

我想首先加载xml,找到样式表节点,然后调用Load加载样式表,还是有其他方法可以做到?

3 个答案:

答案 0 :(得分:5)

<? ... ?>是处理说明(PI),因此<?xml-stylesheet ... ?>提示如何转换xml。但这不会自动发生。对这些指令的解释取决于处理器。如何处理这些信息取决于您的要求:

您可以通过XmlDocument,XDocument,...加载您的xml,PI将被忽略。您可以根据需要使用xml:按原样使用它,通过您选择的任何xsl转换进行转换,或者检索href - PI的属性并使用该转换。

回到原来的问题:如果您希望通过给定的XSLT转换xml,那么工作流程就像您预期的那样:

  • 加载xml
  • 将href检索到xslt转换
  • 加载xslt
  • 通过xslt
  • 转换xml

答案 1 :(得分:2)

您正在加载源xml,加载xslt并将其应用于另一个 .NET中的本机XSLT2支持有限,因此我建议使用AltovaXML库altova xml,可以在那里找到用法altova xml online documentaion

XSLT 2.0转换(XML到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转换(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转换(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);

答案 2 :(得分:1)

实现xml-stylesheet处理指令取决于用户代理。 .NET XML库不是您的程序的用户代理。所以,是的,您将不得不查看此处理指令并自行加载XSLT。

如果你需要处理这个PI的所有荣耀,你一定要看the W3C recommendation。 PI可以包含的不仅仅是对样式表的引用(即伪属性)。如果您正在处理的文档使用PI的每个方面,这可能很重要。