<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! Множество пустых элементов и - что удивительно - элементов, содержащих одну двойную кавычку. Листья тоже там, в конце. Полная таблица стилей теста может быть найдена здесь вместе с результатом на моем компьютере. Откуда берутся дополнительные элементы?