Xslt 迭代模板中的嵌套If求值,尽管First If返回False

Xslt 迭代模板中的嵌套If求值,尽管First If返回False,xslt,xslt-2.0,Xslt,Xslt 2.0,我正在使用一个迭代模板来汇总一些我看不到更干净的管理方法的元素。但是,尽管初始if语句的计算结果为false,但仍在计算嵌套if 这个代码片段并不优雅,但显示了我正在处理的内容。测试变量应该返回一个数字,但返回的是一个空值。我用调试器跟踪了变量,直到最后一次计算,即typeCount大于typeTotal,一切都很好。此时,正在计算position=typeCount并重置rowCount 据我所知,如果第一个失败,第二个If没有理由进行评估。因此,最后一次迭代生成的结果应该返回给测试变量 我使

我正在使用一个迭代模板来汇总一些我看不到更干净的管理方法的元素。但是,尽管初始if语句的计算结果为false,但仍在计算嵌套if

这个代码片段并不优雅,但显示了我正在处理的内容。测试变量应该返回一个数字,但返回的是一个空值。我用调试器跟踪了变量,直到最后一次计算,即typeCount大于typeTotal,一切都很好。此时,正在计算position=typeCount并重置rowCount

据我所知,如果第一个失败,第二个If没有理由进行评估。因此,最后一次迭代生成的结果应该返回给测试变量

我使用Saxon PE 9.7.0.19处理器在OxygenML中运行这个

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output encoding="UTF-8" method="text"/>

    <xsl:variable name="contractTypeCount" select="count(distinct-values(costDefinitions/cost/contract/contractType/@printcode))"/>

    <xsl:template match="/">
        <xsl:variable name="test">
            <xsl:call-template name="typeGrouping">
                <xsl:with-param name="rowCount" select="0"/>
                <xsl:with-param name="typeCount" select="1"/>
                <xsl:with-param name="typeTotal" select="$contractTypeCount"/>
            </xsl:call-template>
        </xsl:variable>

       <xsl:value-of select="concat('Count:',$test)"/>
    </xsl:template>


    <xsl:template name="typeGrouping">
        <xsl:param name="typeCount"/>
        <xsl:param name="rowCount"/>
        <xsl:param name="typeTotal"/>

        <xsl:if test="$typeCount &lt;= $typeTotal">
            <xsl:for-each-group select="/costDefinitions/cost/contract/contractType" group-by="@printcode">
                <xsl:sort select="@printcode" data-type="text" order="ascending"/>
                <xsl:if test="position() = $typeCount">
                    <xsl:variable name="typeTemp" select="@printcode"/>
                    <xsl:variable name="countTemp" select="count(distinct-values(/costDefinitions/cost[contract/contractType/@printcode = $typeTemp]/creditor/@printcode))"/>
                    <xsl:call-template name="typeGrouping">
                        <xsl:with-param name="typeCount" select="$typeCount + 1"/>
                        <xsl:with-param name="rowCount" select="$rowCount + $countTemp"/>
                        <xsl:with-param name="typeTotal" select="$typeTotal"/>
                    </xsl:call-template>
                </xsl:if>
            </xsl:for-each-group>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>
有了这个XML片段,我希望返回值为5:Purchase=3,Barter=2

<?xml version="1.0" encoding = "UTF-8"?>
<costDefinitions>
    <cost>
        <contract>
            <contractType printcode="Purchase"/>
        </contract>
        <creditor printcode="ABCD"/>
    </cost>
    <cost>
        <contract>
            <contractType printcode="Purchase"/>
        </contract>
        <creditor printcode="ABCD"/>
    </cost>
    <cost>
        <contract>
            <contractType printcode="Barter"/>
        </contract>
        <creditor printcode="ABCD"/>
    </cost>
    <cost>
        <contract>
            <contractType printcode="Purchase"/>
        </contract>
        <creditor printcode="ABCD"/>
    </cost>
    <cost>
        <contract>
            <contractType printcode="Purchase"/>
        </contract>
        <creditor printcode="KMNO"/>
    </cost>
    <cost>
        <contract>
            <contractType printcode="Barter"/>
        </contract>
        <creditor printcode="KMNO"/>
    </cost>
    <cost>
        <contract>
            <contractType printcode="Purchase"/>
        </contract>
        <creditor printcode="KMNO"/>
    </cost>
    <cost>
        <contract>
            <contractType printcode="Purchase"/>
        </contract>
        <creditor printcode="KMNO"/>
    </cost>
    <cost>
        <contract>
            <contractType printcode="Purchase"/>
        </contract>
        <creditor printcode="STUV"/>
    </cost>
    <cost>
        <contract>
            <contractType printcode="Purchase"/>
        </contract>
        <creditor printcode="STUV"/>
    </cost>
</costDefinitions>

我并没有真正研究XSLT为什么不能提供所需的结果,因为实际上有一种更简单的方法可以做到这一点。您可以这样获得不同的计数:

 <xsl:variable name="contractTypeCount" 
               select="count(distinct-values(costDefinitions/cost/concat(contract/contractType/@printcode, '|', creditor/@printcode)))"/>

因此,该变量应包含所需的5。

该变量确实产生了结果,这非常好。现在我很好奇为什么国际单项体育联合会在评估它的方式。我想了解代码在哪里出错,以防我不得不再次做一些愚蠢的迭代模板。现在更详细地看一下,你的模板实际上没有输出任何东西。它为每个组执行xsl:for,设置一些变量,并有条件地再次调用模板,但没有xsl:value of或xsl:copy of,因此模板不会有效地返回任何内容。