我遇到了xsl:templates和xsl:call-template标签的问题。也许这是一种缺乏理解,但这就是我想要做的......
如果我有一个与“/ *”匹配的模板,并且我需要在封闭模板中调用其他需要其他文档上下文的模板,那么最有效的方法是什么?
<xsl:template match="/*">
<xsl:call-template name="header">
<xsl:with-param name="headerContext" select="./[1]"/>
</xsl:call-template>
<xsl:call-template name="body">
<xsl:with-param name="bodyContext" select="*/*/[1]"/>
</xsl:call-template>
<xsl:template>
我在调用头文件和正文模板时使用xsl:with-param,这样我就可以覆盖封闭模板中的match =“/ *”,但是当我这样做时,输出就搞砸了。如果我注释掉对“标题”模板的调用,则正文模板可以正常工作,反之亦然,但是如上例所示,从主模板调用两者会使它们表现得很奇怪。标题和正文模板需要选择文档的不同部分,这就是我选择使用w0th-param的原因,但我认为它甚至不起作用。
我应该使用apply-templates吗?
答案 0 :(得分:0)
XSL旨在基于事件。因此,通常情况下,您需要使用模板匹配而不是明确指定要处理的后代。
<!-- Identity Template will copy every node to the output. -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- You listed ./[1] as your xpath, but you might want to add more information
to make it more specific. i.e. element names, not just * and position. -->
<xsl:template match="/*/header">
<someOutputHeader><xsl:apply-templates /></someOutputHeader>
</xsl:template>
<xsl:template match="/something/*/body">
<newBody><xsl:apply-templates /></newBody>
</xsl:template>
此外,最好在谓词之前指定nodeTest。因此,例如,您可以在斜杠后指定*,而不是写“./ [1]”。 “./ * [1]”你也不需要使用“./”。它是由xpath暗示的。真的,这是“* [1]”