XslTransform 类实现 XSLT 处理器
注意 |
---|
XslTransform 类在 .NET Framework 2.0 版 中已过期。可以使用 XslCompiledTransform 类执行可扩展样式表语言转换 (XSLT) 转换。有关更多信息,请参见使用 XslCompiledTransform 类和从 XslTransform 类迁移。 |
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 作为输入。
Overloads Public Sub Load(String)
public void Load(string);
Overloads Public Sub Load(String, XmlResolver)
public void Load(string, XmlResolver);
Overloads Public Sub Load(XmlReader, XmlResolver, Evidence)
public void Load(XmlReader, XmlResolver, Evidence);
Overloads Public Sub Load(XPathNavigator, XmlResolver, Evidence)
public void Load(XPathNavigator, XmlResolver, Evidence);
上面所示的多数 Load 方法都接受 XmlResolver 作为参数。 XmlResolver 用于加载该样式表以及 xsl:import 和 xsl:include 元素中引用的任何样式表。
多数 Load 方法还接受 evidence 作为参数。 evidence 参数是与样式表关联的 Evidence。 样式表的安全级别影响它引用的所有资源的安全级别,例如包含的脚本、使用的任何 document() 函数以及 XsltArgumentList 使用的任何扩展对象。
如果样式表是使用一个包含 URL 参数但没有提供证据的 Load 方法加载的,该样式表的证据将通过结合给定的 URL 与其站点和区域计算得出。
如果未提供 URI 或证据,那么样式表的 证据集就完全受信任。 不要从不受信任的源加载样式表或将不受信任的扩展对象添加到 XsltArgumentList。
有关安全级别和证据及其对脚本的影响的更多信息,请参见 使用 <msxsl:script> 编写 XSLT 样式表脚本。 有关安全级别和证据及其对扩展对象的影响的信息,请参见 样式表参数和扩展对象的 XsltArgumentList。
有关安全级别和证据及其对 document() 函数的影响的信息,请参见解析外部 XSLT 样式表和文档。
可以给样式表提供许多输入参数。 样式表也可以调用扩展对象上的函数。 参数和扩展对象都是使用 XsltArgumentList 类提供给样式表的。 有关 XsltArgumentList 的更多信息,请参见 XsltArgumentList 成员。
XslTransform 类建议的安全用法
样式表的安全特权取决于提供的证据。 下表概括了样式表的位置并说明了应提供的证据类型。
方案 |
提供的证据类型 |
---|---|
XSLT 样式表没有外部引用,或者样式表来自您信任的代码库。 |
提供源自您的程序集的证据:
|
XSLT 样式表来自外部源。 源的来源已知而且有一个可验证的 URI。 |
用 URI 创建证据。
|
XSLT 样式表来自外部源。 源的来源未知。 |
将 evidence 设置为 null。 脚本块将不进行处理,不支持 XSLT document() 函数,而且不允许特权扩展对象。 此外,您还可以将 resolver 参数设置为 null。这可确保不处理 xsl:import 和 xsl:include 元素。 |
XSLT 样式表来自外部源。 源的来源未知,但您需要脚本支持。 |
从调用方请求证据。 |
XML 数据的转换
加载样式表后,转换过程将调用一个 Transform 方法并提供输入源文档,开始进行转换。 重载 Transform 方法以提供不同的转换输出。 转换可产生下列输出格式:
文件的字符串 URL
最后一种格式是字符串 URL,为转换位于 URL 中的输入文档并将文档写入输出 URL 提供了一种常用方案。 此 Transform 方法是从文件加载 XML 文档、执行 XSLT 转换并将输出写入文件的便捷方法。 这样,您就不必创建并加载输入源文档,然后写入文件流。 下面的代码示例显示了 Transform 方法的用法,使用字符串 URL 用作输入和输出:
Dim xsltransform As XslTransform = New XslTransform()
xsltransform.Load("favorite.xsl")
xsltransform.Transform("MyDocument.Xml", "TransformResult.xml", Nothing)
XslTransform xsltransform = new XslTransform();
xsltransform.Load("favorite.xsl");
xsltransform.Transform("MyDocument.xml", "TransformResult.xml", null);
转换 XML 文档的节
转换将应用于整个文档。 换句话说,如果您传入文档根节点以外的一个节点,并不能防止转换进程访问已加载文档的所有节点。 若要转换结果树片段,必须创建一个仅包含结果树片段的 XmlDocument,并将该 XmlDocument 传递给 Transform 方法。 下面的示例对一个结果树片段执行转换。
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 result tree fragment.
Dim testNode As XmlNode = doc.DocumentElement.FirstChild
Dim tmpDoc As New XmlDocument()
tmpDoc.LoadXml(testNode.OuterXml)
' Pass the document containing the result tree fragment
' to the Transform method.
Console.WriteLine(("Passing " + tmpDoc.OuterXml + " to print_root.xsl"))
xslt.Transform(tmpDoc, Nothing, Console.Out, Nothing)
XslTransform xslt = new XslTransform();
xslt.Load("print_root.xsl");
XmlDocument doc = new XmlDocument();
doc.Load("library.xml");
// Create a new document containing just the result tree fragment.
XmlNode testNode = doc.DocumentElement.FirstChild;
XmlDocument tmpDoc = new XmlDocument();
tmpDoc.LoadXml(testNode.OuterXml);
// Pass the document containing the result tree 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 文件作为输入并将以下内容输出到控制台。
Passing <book genre="novel" ISBN="1-861001-57-5"><title>Pride And Prejudice</title></book> to print_root.xsl
Root node is book.
library.xml
<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
<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 版的迁移
下表显示 Load 方法的已过时的 .NET Framework 1.0 版方法以及新的 .NET Framework 1.1 方法。 新方法允许您通过指定证据来限制样式表的权限。
.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); |
下表显示 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 的 XPathDocument 输入