看起来每个人都说如果你使用XslTransform,你应该先调用Load来加载样式表,然后调用Transform来转换它。但是我有以下XML文件:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="some_stylesheet.xsl" ?>
....
</xml>
我是否应该首先加载xml,找到样式表节点,然后调用load来加载样式表,或者有另一种方法?
<? ... ?>
是处理指令(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的各个方面,这一点可能很重要。