Вложенный, если в итеративном шаблоне оценивается несмотря на первый, если возвращается False - PullRequest
0 голосов
/ 23 октября 2019

Я использую итеративный шаблон для подсчета количества элементов, где я не смог найти более понятный способ управления. Однако вложенный if оценивается, несмотря на то, что исходный оператор if оценивается как false.

Этот фрагмент кода не элегантен, но показывает, с чем я имею дело. Тестовая переменная должна возвращаться с номером, но вместо этого возвращает пустое значение. Я отслеживал переменные с помощью отладчика, и все в порядке до последней оценки (т. Е. Когда typeCount больше, чем typeTotal). В этот момент выполняется оценка позиции () = typeCount и выполняется сброс rowCount.

Насколько я вижу, нет причин для второго If, если оно будет оценено, если первое не получилось. Поэтому результат, полученный в результате последней итерации, должен быть возвращен в тестовую переменную.

Я выполняю это в OxygenML, используя процессор Saxon-PE 9.7.0.19

<?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: покупка = 3 и бартер = 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>

1 Ответ

1 голос
/ 23 октября 2019

Я действительно не задумывался над тем, почему ваш XSLT не дает желаемого результата, потому что на самом деле существует более простой способ сделать это. Вы можете получить отчетливый счет следующим образом:

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

Таким образом, эта переменная должна содержать «5», как нужно.

...