2

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

4

2 回答 2

2

据我所知,没有一种标准方法可以告诉 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。

于 2013-02-07T01:36:26.137 回答
0

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

于 2013-02-06T22:22:42.280 回答