Неожиданные элементы в результате функции XSLT - PullRequest
1 голос
/ 08 марта 2020
    <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: участники имеют два состояния: собирать группы, собирать листья. Имена групп не добавляются в результат. Рекурсия завершается, когда список пуст. Для данных тестов я ожидаю 7 листов в корзине. Но я получаю 22! Множество пустых элементов и - что удивительно - элементов, содержащих одну двойную кавычку. Листья тоже там, в конце. Полная таблица стилей теста может быть найдена здесь вместе с результатом на моем компьютере. Откуда берутся дополнительные элементы?

1 Ответ

1 голос
/ 08 марта 2020

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

...