zoukankan      html  css  js  c++  java
  • XslTransform 类实现 XSLT 处理器

    XslTransform 类是实现 XSL 转换 (XSLT) 1.0 版建议的 XSLT 处理器。Load 方法定位并读取样式表,Transform 方法转换给定的源文档。任何实现了 IXPathNavigable 接口的存储区都可以用作 XslTransform 的源文档。.NET Framework 当前在 XmlDocumentXmlDataDocumentXPathDocument 上实现了 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> 引用的资源。下列方法以字符串、XmlReaderXPathNavigator 作为输入。

    [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 与其站点和区域计算得出。

    如果未提供 URIEvidence,那么样式表的 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)。这样可确保不处理 xsl:importxsl:include 元素。

    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.xmlprint_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 is book.

    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 成员

  • 相关阅读:
    [Javascript] Broadcaster + Operator + Listener pattern -- 9. Create modify, filter, map operators
    [Javascript] Broadcaster + Operator + Listener pattern -- 8. Pass a Done Symbol when an Async Function is Done
    [Javascript] Broadcaster + Operator + Listener pattern -- 7. Create a broadcaster forOf
    [Javascript] Broadcaster + Operator + Listener pattern -- 6. Create a Buffer to Pair Values Together with Zip
    [Functional Programming] Match Function Requirements with Lodash Partial and Flip
    [Javascript] Broadcaster + Operator + Listener pattern -- 5. Merge (Example)
    [React] Performance: Split state update and component render with Hoc
    [React] Optimize context value
    [React] useAsync
    Nodejs.sublime-build 在sublime3中的配置
  • 原文地址:https://www.cnblogs.com/chinatefl/p/131771.html
Copyright © 2011-2022 走看看