【问题标题】:Processing the output of another XSLT Stylesheet处理另一个 XSLT 样式表的输出
【发布时间】:2013-02-06 22:01:46
【问题描述】:

我有一个 XSLT 样式表,可以在 XML 中生成一些输出。我想用另一个样式表处理该输出。有没有办法告诉后者样式表“运行和使用”前者的结果?

【问题讨论】:

    标签: xslt


    【解决方案1】:

    据我所知,没有一种标准方法可以告诉 XSLT 处理器在给定的输入上运行另一个样式表并对输出进行处理。在某些情况下,您可以针对一组模板处理输入并将结果保存在变量中,然后将一组不同的模板应用于变量的值,如下所示:

    <xsl:template match="/">
      <xsl:variable name="temp">
        <xsl:apply-templates mode="first-pass"/>
      </xsl:variable>
      <xsl:apply-templates select="$temp" mode="second-pass"/>
    </xsl:template>
    

    这假设您正在运行 XSLT 2.0。在 XSLT 1.0 中,您将需要一个支持节点集扩展的处理器(很多都支持),并且您需要将对 $temp 的引用更改为类似 exslt:nodeset($temp) 的内容。

    如您所见,如果您的两个样式表都使用默认模式并在重叠的元素类型集上操作,这将不会很好地工作。因此,一些 XSLT 处理器添加了扩展来提供您所描述的那种功能(例如,参见 Xalan pipe:pipeDocument 扩展元素的讨论)。

    当然,您也可以在 XSLT 之外处理管道。最简单的方法取决于您运行的环境。

    如果您从操作系统 shell 运行 XSLT,并且您的 XSLT 处理器接受标准输入上的输入,您可以通过管道将输出从一个样式表传递到另一个:

    xsltproc a.xsl in.xml | xsltproc b.xsl - > out.xml
    

    正如 mohammed moh 已经指出的那样,许多脚本环境可以做类似的事情:他提到了 PHP,当然还有 XProc。

    【讨论】:

      【解决方案2】:

      是的,你可以。您必须将源节点转换为 DOMDocument 我不知道您的编程语言是什么。例如 php 中的 transformToDoc() 在转换后您可以在 DOMDocument 输出上运行新的 XSLT 样式表

      【讨论】:

        猜你喜欢
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        • 2020-01-16
        • 1970-01-01
        • 2014-03-02
        • 2019-11-24
        • 2011-04-26
        • 1970-01-01
        相关资源
        最近更新 更多