xslt通过所有apply-template调用传递参数

时间:2014-02-07 14:19:38

标签: xslt parameters

在一个相当复杂的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>

但这意味着要付出很多努力。有更好的方法吗?

1 个答案:

答案 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处理器就可以做到这一点。