将属性添加到xsl:apply-imports的结果中

时间:2010-03-01 16:23:20

标签: xml xslt

我有一个XSL样式表(A)导入另一个(B)。 A覆盖B中的模板(t),并使用apply-imports调用B的模板:

来自A:

<xsl:template match="t">
    <xsl:apply-imports/>
</xsl:template>

来自B:

<xsl:template match="t">
    <p><!-- Do something --></p>
</xsl:template>

我现在希望A为apply-imports返回的片段(<p> ... </p>)添加一个属性。该属性应直接添加到元素p,p不应包含在另一个元素中。我怎么能这样做?

此致 约亨

4 个答案:

答案 0 :(得分:1)

恕我直言,你不能。

B是自包含的,当匹配模板完成运行时,<p>已在结果树中构建,并且A无法访问。

答案 1 :(得分:0)

考虑对B进行一些预处理。毕竟它只是一个xml。

答案 2 :(得分:0)

您可以在B模板中添加参数并将其包含在A匹配中吗?这样,您可以根据A匹配添加所需的属性。

答案 3 :(得分:0)

在XSLT1中,您可以通过使用变量捕获原始模板输出来实现所需的结果,然后再修改它。不幸的是,这需要exsl:node-set外部函数从result tree fragment转换为节点集。

(使用xsltproc测试)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl"
                ...
                version='1.0'>

<xsl:import href="B.xsl" />

<xsl:template match="t">
  <!-- capture inherited template result -->
  <xsl:variable name="baseresult">
    <xsl:apply-imports/>
  </xsl:variable>
  <!-- apply custom transformation each node of the result -->
  <xsl:for-each select="exsl:node-set($baseresult)/node()">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:attribute name="class">overrided</xsl:attribute>
      <xsl:copy-of select="node()"/>
    </xsl:copy>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>