Я пытаюсь найти способ индексировать узлы, которые содержат определенный тип подузла, и индексировать их, начиная с единицы и увеличивая по одному на каждый найденный подузел. Я попытался использовать count (), но это отображает положение узла в моем коде, а не индекс найденного подузла. В других языках я бы использовал переменную, но это не вариант в XSLT.
Я прочитал несколько примеров рекурсивного подсчета с использованием шаблонов, но я недостаточно знаком с XSLT, чтобы интегрировать его в мой существующий код.
XML
<?xml version="1.0" encoding="UTF-8"?>
<entry>
<node>
<subnodeA>test_subnodeA1</subnodeA>
<subnodeB>test_subnodeB1</subnodeB>
</node>
<node>
<subnodeA>test_subnodeA2</subnodeA>
<subnodeB>test_subnodeB2</subnodeB>
</node>
<node>
<subnodeA>test_subnodeA3</subnodeA>
</node>
<node>
<subnodeA>test_subnodeA4</subnodeA>
<subnodeB>test_subnodeB3</subnodeB>
</node>
</entry>
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<!-- Initial usage -->
<xsl:for-each select="node">
<xsl:value-of select="subnodeA"/>
<xsl:if test="subnodeB != ''">
<xsl:value-of select="position()"/>
</xsl:if>
</xsl:for-each>
<!-- Second usage -->
<xsl:for-each select="node">
<xsl:if test="subnodeB != ''">
<xsl:value-of select="position()"/>.
<xsl:value-of select="subnodeB"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
Я хочу отобразить что-то вроде
test_subnodeA1 1
test_subnodeA2 2
test_subnodeA3
test_subnodeA4 3
1 test_subnodeB1
2 test_subnodeB2
3 test_subnodeB3
Но, используя мой метод, я могу получить только
test_subnodeA1 1
test_subnodeA2 2
test_subnodeA3
test_subnodeA4 4
1 test_subnodeB1
2 test_subnodeB2
4 test_subnodeB3
Некоторые записи имеют несколько узлов без подузла B, а затем узел с одним, поэтому мои списки начинаются с 3, 4 или 5.