使用xml-stylesheet进行xsl转换

本文关键字:转换 xsl 进行 xml-stylesheet 使用 | 更新日期: 2023-09-27 18:06:36

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

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

我是否应该首先加载xml,找到样式表节点,然后调用load来加载样式表,或者有另一种方法?

使用xml-stylesheet进行xsl转换

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

你可以通过XmlDocument, XDocument,…PI将被忽略。你可以用你的xml做任何你想要的:使用它,通过你选择的任何xsl转换或检索PI的href属性并使用该转换。

回到你最初的问题:如果你想让你的xml被给定的XSLT转换,那么工作流就是你所期望的:

  • 加载xml
  • 检索href到xslt转换
  • 加载xslt
  • 转换xml

您正在加载源xml,加载xslt并将它们应用于另一个.NET中对原生XSLT2的支持有限,所以我建议使用AltovaXML库altova xml,使用方法可在altova xml在线文档

中找到。

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转换(字符串到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转换(字符串到字符串)

// 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);

实现xml-stylesheet处理指令取决于用户代理。. net XML库不是用户代理,您的程序是。所以,是的,您必须查看这个处理指令并自己加载XSLT。

如果您需要处理这个PI的所有优点,您绝对应该查看W3C推荐。PI可以包含的不仅仅是对样式表的引用(即伪属性)。如果要处理的文档使用PI的各个方面,这一点可能很重要。