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