Я использую итеративный шаблон для подсчета количества элементов, где я не смог найти более понятный способ управления. Однако вложенный 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 <= $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>