Неожиданные элементы в результате функции XSLT

    <xsl:function name="f:members" as="xs:string*">
        <xsl:param name="in" as="xs:string*"/>
        <xsl:param name="grp" as="xs:string*"/>
        <xsl:param name="result" as="xs:string*"/>
        <xsl:param name="state" as="xs:integer"/>"
        <xsl:choose>
            <xsl:when test="empty($in)">
                <xsl:sequence select="$result"/>
            </xsl:when>
            <xsl:when test="$state=0">
                <xsl:sequence select="f:leafs(remove($in,1),$grp,$result,1)"/>
            </xsl:when>
            <xsl:when test="$state=1 and not($in[1]=$grp)">
                <xsl:sequence select="f:leafs(remove($in,1),($grp,$in[1]),$result,1)"/>
            </xsl:when>
            <xsl:when test="$state=1 and $in[1]=$grp">
                <xsl:sequence select="f:leafs(remove($in,1),$grp,$result,2)"/>
            </xsl:when>
            <xsl:when test="$state=2 and not($in[1]=$grp)">
                <xsl:sequence select="f:leafs(remove($in,1),$grp,($result,$in[1]),2)"/>
            </xsl:when>
            <xsl:when test="$state=2 and $in[1]=$grp">
                <xsl:sequence select="f:leafs(remove($in,1),$grp,$result,2)"/>
            </xsl:when>
        </xsl:choose>
    </xsl:function>

'trees','oak1','beech1','beech2',
'oak1','oak-leaf1','oak-leaf2',
'beech1','beach-leaf1','beach-leaf2','beach-leaf5',
'beech2','beach-leaf3','beach-leaf4'

Процессор: Saxon-HE 9.9.1-5, вызывается из Java через Saxon API.
Дан список групп. Первая группа включает названия следующих групп. Эта группа имен групп заканчивается, когда появляется имя группы.
Я сократил свою проблему до сада с 3 деревьями, у каждого из которых есть несколько листьев. Деревья группируют листья.
Теперь я хочу заполнить переменную (корзину из листьев) членами группы, листьями, путем вызова рекурсивной функции f: members.
f: members имеет два состояния: собирать группы, соберите листы.
Имена групп не добавляются к результату.
Рекурсия прекращается, когда список пуст.

Для заданных тестовых данных я ожидаю 7 листы в корзине.
А я получаю 22! Множество пустых элементов и, что удивительно, элементов, содержащих одну двойную кавычку. Листы тоже там, в конце.

Полную таблицу стилей тестирования можно найти здесь вместе с результатом на моем компьютере.

Откуда берутся дополнительные элементы?


person ngong    schedule 08.03.2020    source источник


Ответы (1)


По некоторым причинам у вас есть строка <xsl:param name="state" as="xs:integer"/>" (обратите внимание на завершающий ") там, где вы буквально выводите цитату " при каждом вызове вашей функции, поэтому я полагаю, вы хотите удалить эту буквальную цитату и просто объявить параметр <xsl:param name="state" as="xs:integer"/>.

person Martin Honnen    schedule 08.03.2020
comment
Спасибо, Мартин - я смотрел код за 2 дня до того, как спросил здесь, и провел множество проверок. Иногда нужно 4 глаза, чтобы найти простейшие причины. - person ngong; 08.03.2020