在一个相当复杂的xslt文件中,一些元素要处理两次。这是通过带有参数的模板完成的。
<xsl:template macht="x">
<xsl:param name="modus"/>
<!-- comon things to do for both cases -->
<xsl:choose>
<xsl:when test="$modus='case1'"> <!-- things to do in case 1 --> </xsl:when>
<xsl:when test="$modus='case2'"> <!-- things to do in case 2 --> </xsl:when>
</xsl:choose>
</xsl:template>
问题是:我不能简单地直接申请或调用此模板。元素x(具有这两种情况的模板用于该元素)通常处于xml输入的相当低的级别。在实际来到x之前,几乎所有的祖先元素都必须被处理(在两种情况下)。
两个案件的呼吁处于最高层。 在HTML中,它就像这样
<body>
<h1>Case 1</h1>
<xsl:apply-templates><xsl:with-parameter name="modus" select="case1"/>
<h1>Case 2</h1>
<xsl:apply-templates><xsl:with-parameter name="modus" select="case2"/>
</body>
因此。如何确保参数到达x?
的模板当然,我可以替换所有
<xsl:apply-templates/>
在x的每个祖先元素的模板内调用
<xsl:param name="modus">
<!-- What ever content here -->
<xsl:apply-templates><xsl:with-parameter name="modus" select="$modus"/></apply-templates>
但这意味着要付出很多努力。有更好的方法吗?
答案 0 :(得分:1)
XSLT 2.0具有隧道参数,例如与
<xsl:apply-templates>
<xsl:with-param name="modus" tunnel="yes" select="'foo'"/>
</xsl:apply-templates>
和
<xsl:template match="bar">
<xsl:param name="modus" tunnel="yes"/>
...
</xsl:template>
您不必在bar
的祖先模板中明确传递参数。因此,使用像Saxon 9这样的XSLT 2.0处理器就可以做到这一点。