我有一个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不应包含在另一个元素中。我怎么能这样做?
此致 约亨
答案 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>