如何过早退出模板?

时间:2011-07-11 14:46:00

标签: xml xslt

如何提前退出模板?

就像我想要的那样:

<xsl:template match="asd">
    <xsl:if test="$true">EXIT TEMPLATE()</xsl:if>
    <!--my main code here-->
</xsl:template>

我现在正在这样做(当然这是有效的)但是无论如何,如果它的变体有效,上面的代码就更加整洁了:

<xsl:template match="asd">
            <xsl:choose>
                <xsl:when test="$true"></xsl:when>
                <xsl:otherwise>
                    <!--my main code here-->
                </xsl:otherwise>
            </xsl:choose>
        </xsl:template>

3 个答案:

答案 0 :(得分:3)

你不能完全按照你的描述去做; XSLT是一种声明性语言,而不是程序性语言,它并没有真正考虑到“程序流程”。但是,为了解释您的示例,您可以这样做:

<xsl:template match="asd[not($true)]">
  <!--my main code here-->
</xsl:template>

这方面的缺点是它会阻止你首先输入模板,因此你不能在'if'之前有任何东西。

注意:严格来说,XSLT1.0的规范不应该允许变量处于这样的匹配条件,但是许多XSLT 1.0引擎无论如何都会这样做,这只是一个问题,如果你的条件确实有像这样的变量。但是,XSLT 2.0正式允许它。

答案 1 :(得分:3)

有几种方法可以做到这一点。如果您的条件不包含变量/参数引用(在XSLT 1.0中的匹配模式中不允许),那么只需将其移动到匹配模式中,如下所示:

<xsl:template match="asd[not(<some_boolean_expression>)]">
    <!--my main code here-->
</xsl:template>

如果$true是变量/参数引用,则有条件地应用模板:

<xsl:template match="parent_of_asd">
    <xsl:apply-templates select="asd[not($true)]"/>
</xsl:template>

<xsl:template match="asd">
    <!--my main code here-->
</xsl:template>

答案 2 :(得分:2)

如果:

  • 您没有使用XSLT 2.0(@Flynn的回答)
  • 您不想删除变量引用或使用apply-templates方法(@ Iwburk的回答)

您仍然可以使用xsl:if并使用否定逻辑方法:

<xsl:if test="not($true)">
 <!--your main code here-->
</xsl:if>