XslTransform 类是实现 XSL 转换 (XSLT) 1.0 版建议的 XSLT 处理器。Load 方法定位并读取样式表,Transform 方法转换给定的源文档。任何实现了 IXPathNavigable 接口的存储区都可以用作 XslTransform 的源文档。.NET Framework 当前在 XmlDocument、XmlDataDocument 和 XPathDocument 上实现了 IXPathNavigable 接口,所以它们都可以用作转换的输入源文档。
.NET Framework 中的 XslTransform 对象仅支持用以下命名空间定义的 XSLT 1.0 规范:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
样式表可以用 Load 方法从下列类之一中加载:
- XPathNavigator
- XmlReader
- 表示 URI 的字符串
上面的各输入类分别有不同的 Load 方法。有些方法取其中的一个类和 XmlResolver 类的组合作为参数。XmlResolver 定位由样式表中的 <xsl:import>
或 <xsl:include>
引用的资源。下列方法以字符串、XmlReader 或 XPathNavigator 作为输入。
[Visual Basic] Overloads Public Sub Load(String) [C#] public void Load(string); [Visual Basic] Overloads Public Sub Load(String, XmlResolver) [C#] public void Load(string, XmlResolver); [Visual Basic] Overloads Public Sub Load(XmlReader, XmlResolver, Evidence) [C#] public void Load(XmlReader, XmlResolver, Evidence); [Visual Basic] Overloads Public Sub Load(XPathNavigator, XmlResolver, Evidence) [C#] public void Load(XPathNavigator, XmlResolver, Evidence);
上面所示的多数 Load 方法都取 XmlResolver 作为参数。XmlResolver 用于加载样式表和 xsl:import 以及 xsl:include 元素中引用的任何样式表。
多数 Load 方法还取 Evidence 作为参数。Evidence 参数是与样式表关联的 System.Security.Policy.Evidence。样式表的安全级别影响它引用的所有资源的安全级别,例如它包含的脚本、它使用的任何 document()
函数,以及 XsltArgumentList 使用的任何扩展对象。
如果样式表是使用一个包含 URL 参数但没有 Evidence 参数的 Load 方法加载的,该样式表的证据将通过结合给定的 URL 与其站点和区域计算得出。
如果未提供 URI 或 Evidence,那么样式表的 Evidence 集就完全受信任。不要从不受信任的源加载样式表或将不受信任的扩展对象添加到 XslArgumentList。
有关重载的 Load 方法的更多信息,请参见 XslTransform.Load 方法。有关安全级别和 Evidence 以及 Evidence 如何影响脚本撰写方面的更多信息,请参见使用 <msxml:script> 的 XSLT 样式表脚本撰写。有关安全级别和 Evidence 以及 Evidence 如何影响扩展对象方面的更多信息,请参见样式表参数和扩展对象的 XsltArgumentList。
有关安全级别和 Evidence 以及 Evidence 如何影响 document()
函数方面的更多信息,请参见解析外部 XSLT 样式表和文档。
可以给样式表提供许多输入参数。样式表也可以调用扩展对象上的函数。参数和扩展对象都是使用 XsltArgumentList 类提供给样式表的。有关 XsltArgumentList 的更多信息,请参见 XsltArgumentList 成员。
XslTransform 类的建议安全用法
样式表的安全特权取决于提供的 Evidence。下表概括了样式表的位置并说明了应提供何种类型的证据。
方案 | 提供的证据类型 |
---|---|
XSLT 样式表没有外部引用,或者样式表来自您信任的代码库。 | 提供源自您的程序集的样式表: [Visual Basic] Dim xslt = New XslTransform() xslt.Load(stylesheet, resolver, Me.GetType().Assembly.Evidence) [C#] XsltTransform xslt = new XslTransform(); xslt.Load(stylesheet, resolver, this.GetType().Assembly.Evidence); |
XSLT 样式表来自外部源。源的来源已知而且有一个可验证的 URI。 | 用 URI 创建证据。 [Visual Basic] Dim xslt As New XslTransform() Dim ev As Evidence = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri) xslt.Load(stylesheet, resolver, evidence) [C#] XslTransform xslt = new XslTransform(); Evidence ev = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri); xslt.Load(stylesheet, resolver, evidence); |
XSLT 样式表来自外部源。源的来源未知。 | 将证据设置为 null 引用(在 VB 中为 Nothing)。脚本块将不受处理,XSLT document() 函数不受支持,而且不允许特权扩展对象。
另外,您还可以将 resolver 参数设置为 null 引用 (Nothing)。这样可确保不处理 |
XSLT 样式表来自外部源。源的来源未知,但您需要脚本支持。 | 从调用方请求证据。 |
XML 数据的转换
加载样式表后,转换过程将调用一个 Transform 方法并提供输入源文档,开始进行转换。重载 Transform 方法以提供不同的转换输出。转换可产生下列输出格式:
- XmlReader
- XmlWriter
- TextWriter
- 流
- 文件的字符串 URL
最后一种格式是字符串 URL,它为转换位于 URL 中的输入文档并将文档写入到输出 URL 提供了一种常用方案。此 Transform 方法是从文件加载 XML 文档、执行 XSLT 转换并将输出写入文件的便捷方法。这样,您就不必创建并加载输入源文档,然后写入文件流。下面的代码示例显示了 Transform 方法的用法,如何将字符串 URL 用作输入和输出:
[Visual Basic] Dim xsltransform As XslTransform = New XslTransform() xsltransform.Load("favorite.xsl") xsltransform.Transform("MyDocument.Xml", "TransformResult.xml", Nothing) [C#] XslTransform xsltransform = new XslTransform(); xsltransform.Load("favorite.xsl"); xsltransform.Transform("MyDocument.xml", "TransformResult.xml", null);
转换 XML 文档的节
转换将应用于整个文档。换句话说,如果您传入文档根节点以外的一个节点,并不能防止转换进程访问已加载文档的所有节点。若要转换一个节点片段,必须创建一个仅包含该节点片段的 XmlDocument,并将此 XmlDocument 传递给 Transform 方法。下面的示例对一个节点片段执行转换。
[Visual Basic] Dim xslt As New XslTransform() xslt.Load("print_root.xsl") Dim doc As New XmlDocument() doc.Load("library.xml") ' Create a new document containing just the node fragment. Dim testNode As XmlNode = doc.DocumentElement.FirstChild Dim tmpDoc As New XmlDocument() tmpDoc.LoadXml(testNode.OuterXml) ' Pass the document containing the node fragment ' to the Transform method. Console.WriteLine(("Passing " + tmpDoc.OuterXml + " to print_root.xsl")) xslt.Transform(tmpDoc, Nothing, Console.Out, Nothing) [C#] XslTransform xslt = new XslTransform(); xslt.Load("print_root.xsl"); XmlDocument doc = new XmlDocument(); doc.Load("library.xml"); // Create a new document containing just the node fragment. XmlNode testNode = doc.DocumentElement.FirstChild; XmlDocument tmpDoc = new XmlDocument(); tmpDoc.LoadXml(testNode.OuterXml); // Pass the document containing the node fragment // to the Transform method. Console.WriteLine("Passing " + tmpDoc.OuterXml + " to print_root.xsl"); xslt.Transform(tmpDoc, null, Console.Out, null);
此示例使用 library.xml 和 print_root.xsl 文件作为输入,并将下面的内容输出到控制台。
[Visual Basic, C#] Passing<book genre="novel" ISBN="1-861001-57-5"><title>Pride And Prejudice</title></book>
to print_root.xsl Root node isbook
.
library.xml
[Visual Basic, C#]
<library>
<book genre='novel' ISBN='1-861001-57-5'>
<title>Pride And Prejudice</title>
</book>
<book genre='novel' ISBN='1-81920-21-2'>
<title>Hook</title>
</book>
</library>
print_root.xsl
[Visual Basic, C#]
<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform" >
<output method="text" />
<template match="/">
Root node is <value-of select="local-name(//*[position() = 1])" />
</template>
</stylesheet>
XSLT 从 .NET Framework 1.0 版到 .NET Framework 1.1 版的迁移
下表显示了 .NET Framework 1.0 版中过时的 XslTransform.Load 方法和 .NET Framework 1.1 版中的新 XslTransform.Load 方法。新方法让您可以通过指定证据来限制样式表的权限。
.NET Framework 1.0 版中过时的 Load 方法 | .NET Framework 1.1 版中作为替代的新 Load 方法 |
---|---|
Load(XPathNavigator input);
Load(XPathNavigator input, XmlResolver resolver); |
Load(XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence); |
Load(IXPathNavigable stylesheet);
Load(IXPathNavigable stylesheet, XmlResolver resolver); |
Load(IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence); |
Load(XmlReader stylesheet);
Load(XmlReader stylesheet, XmlResolver resolver); |
Load(XmlReader stylesheet, XmlResolver resolver, Evidence evidence); |
下表显示了 XslTransform.Transform 的过时方法和新方法。新方法采用 XmlResolver 对象作为参数。
过时的 .NET Framework 1.0 版 Transform 方法 | .NET Framework 1.1 版中作为替代的新 Transform 方法 |
---|---|
XmlReader Transform(XPathNavigator input, XsltArgumentList args) | XmlReader Transform(XPathNavigator input, XsltArgumentList args, XmlResolver resolver) |
XmlReader Transform(IXPathNavigable input, XsltArgumentList args) | XmlReader Transform(IXPathNavigable input, XsltArgumentList args, XmlResolver resolver) |
Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output) | Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) |
Void Transform(IXPathNavigable input, XsltArgumentList args, XmlWriter output) | Void Transform(IXpathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) |
Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output) | Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver) |
Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output) | Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver) |
Void Transform(XPathNavigator input, XsltArgumentList args, Stream output) | Void Transform(XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver) |
Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output) | Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver) |
Void Transform(String input, String output); | Void Transform(String input, String output, XmlResolver resolver); |
XslTransform.XmlResolver 属性在 .NET Framework 1.1 版中已过时。应改用采用 XmlResolver 对象作为参数的新的 Transform 重载。
请参见
XslTransform 类的 XSLT 转换 | 转换中的 XPathNavigator | 转换中的 XPathNodeIterator | XslTransform 的 XPathDocument 输入 | XslTransform 的 XmlDataDocument 输入 | XslTransform 的 XmlDocument 输入 | XslTransform 类 | XslTransform 成员