XSL - 匹配调用模板和其他标记的输出

时间:2016-12-05 18:13:23

标签: xml xslt

我有以下问题。我正在尝试使用XSL-T转换XML文件。我有一个像这样的XSL文件:

<!-- here are some imports-->
<xsl:import href="..."/>

<!-- here is template-->
<xsl:template match="...">
    <!-- here are some new tags to be added to the document -->
</xsl:template>

<!-- here is second template-->
<xsl:template match="...">
    <!-- here are some new tags and template-calls from imported xsl documents, such as: -->
    <xsl:call-template name="..."/>
</xsl:template>

<!-- here is the place, where I want to create a match for output from all previous lines... -->
<!-- ... -->

因此,给出了给定的代码片段以显示此xsl文件中发生的情况。我有多个导入和许多模板调用。不幸的是,我需要在所有给定行的输出中添加一些标记,我必须在此文件中执行此操作。我更喜欢使用另一个模板和匹配属性,但我该怎么办呢?

我无法编辑所有导入的文档。另外,我不想创建临时帮助文件。 XSL版本是1.0。

提前谢谢你:)

1 个答案:

答案 0 :(得分:1)

将转换应用于另一个转换的输出时,通常称为管道。在XSLT中实现管道有两种主要技术:一种是为每个转换创建一个单独的样式表,并使用一些外部技术将它们链接在一起,如Ant,XProc,shellcript,Java应用程序或某种框架比如Coccoon。另一种方法是单个样式表中的管道,其中典型的编码模式是

<xsl:template match="/">
  <xsl:variable name="temp1">
    <xsl:apply-templates select="." mode="phase-1"/>
  </xsl:variable>
  <xsl:variable name="temp2">
    <xsl:apply-templates select="$temp1" mode="phase-2"/>
  </xsl:variable>
  <xsl:apply-templates select="$temp2" mode="phase-3"/>
</xsl:template>

多样式表方法有两个优点:(a)代码更模块化,因此更具可重用性;(b)上述代码实际上并不适用于XSLT 1.0,因为您无法应用一般处理到&#34;结果树片段&#34; - 通过使用EXSLT node-set()扩展函数,您可以使用大多数XSLT 1.0处理器解决此问题,因此它变为

<xsl:apply-templates select="exslt:node-set($temp1)" mode="phase-2"/>

但是,您正在寻找管道处理的正确轨道 - 将复杂的转换分解为一系列简单的步骤绝对是正确的方法。