Количество элементов «can» в выходных данных должно быть равно количеству вхождений элемента «c» в элементе «a» во входном xml. Таким образом, первые последовательные вхождения элемента «can» должны быть равны 3 (так как первые последовательные вхождения элемента c под элементом a на входе равны 3), а следующий последовательный вхождение элементов «can» должно быть равно 2, как на входе. Однако в моем текущем выводе это повторяется в общей сложности (5). Я думаю, что нижняя строка должна быть изменена, но не уверен, как, попытался также использовать position (). То есть применять шаблоны только к c под первым (используя count ../) a, затем вторым a.
Строка, я полагаю, должна быть изменена
<xsl:apply-templates select="/*/*[$coun]/c"/>
Мой ввод xml
<Root>
<a>
<b>12</b>
<c>1</c>
<c>2</c>
<c>3</c>
</a>
<a>
<b>12</b>
<c>a</c>
<c>c</c>
</a>
</Root>
Мой xslt
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<Root>
<xsl:apply-templates select="*/*/b"/>
</Root>
</xsl:template>
<xsl:template match="b">
<a>
<xsl:value-of select="../b"/>
</a>
<xsl:variable name="coun">
<xsl:value-of select="count(../preceding-sibling::a) + 1"/>
</xsl:variable>
<xsl:apply-templates select="/*/*[$coun]/c"/>
</xsl:template>
<xsl:template match="c">
<can>abc</can>
</xsl:template>
</xsl:stylesheet>
мой токовый выход
<Root>
<a>12</a>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<a>12</a>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<can>abc</can>
</Root>
мой ожидаемый результат
<Root>
<a>12</a>
<can>abc</can>
<can>abc</can>
<can>abc</can>
<a>12</a>
<can>abc</can>
<can>abc</can>
</Root>