XSLT递归布尔条件

时间:2014-07-29 08:02:40

标签: xml templates xslt recursion boolean

我有一个场景,我使用递归来验证一组元素中的条件是真还是假,当任何元素的条件变为false时,整个条件都为假。

我使用value-of来打印true或false,但是因为它是递归的,所以输出最终会出现类似" truefalsetruetrue"。由于这个原因,我确保只在循环中的条件为假时才使用value-of,因此最终输出结果类似于" falsefalsefalsefalse"。由于这个原因,我检查了最终输出的长度,其中空字符串表示整体条件为真,当不为空时表示错误。

在param" data"中有更优雅的方法可以做到这一点。直接收到" true"或"假"输出可以直接用于检查整体状况是否成功。

<xsl:template match="/">
    <xsl:param name="data">
        <xsl:apply-templates select="Data">
            <xsl:with-param name="expression" select="true" />
        </xsl:apply-templates>
    </xsl:param>
    <!--
        instead of a single false or true it will be like truefalsefalsetrue depending on the number of loops
        As a hack we check if the $data variable is an empty string or not where empty string signifies true
    -->
    <xsl:value-of select="$data=''" />
</xsl:template>

<xsl:template match="Data">
    <xsl:param name="expression"/>
    <xsl:if test="$expression=true()">
        <xsl:apply-templates select="Data" >
            <xsl:with-param name="expression" select="xpathCondition"/>
        </xsl:apply-templates>
    </xsl:if>
    <xsl:if test="$expression=false()">
        <!-- we only output when there is false, so by doing this we can check if the output to the variable in the parent template is empty or not to then
        identify if the overall condition is false or true -->
        <xsl:value-of select="$expression" />
    </xsl:if>
</xsl:template>

谢谢!

2 个答案:

答案 0 :(得分:1)

为什么不全面检查是否存在:

Data [not($expression)]

编辑:

  

有没有办法将单个true或false值返回给   使用递归调用(“/”模板)模板。

可能不是,因为递归在分支上并行运行。我们没有看到您的数据,所以我们只能假设是这种情况。至少在理论上,您可以强制使用自己的递归顺序并使用第一个错误结果退出 - 但我们需要查看您的数据,以便判断是否以及如何完成。

一个更简单的解决方案是评估递归到布尔结果的结果,例如:

<xsl:value-of select="contains ($data, 'false')"/>

这不是一种黑客攻击,只是由于递归工作方式的必要性。

答案 1 :(得分:0)

如果你正在使用XSLT 1.0,那么一种方法是返回“”表示true,将“F”表示为false,如果最终字符串不等于“”,则整体结果为false。

在XSLT 2.0中,更简洁的方法是让模板返回一个布尔值,并使用XPath 2.0 some $x in ... satisfies构造来存在逻辑。