Мне нужно изменить свой XML-файл, установив атрибут "id" некоторых узлов в их положение во всем документе. Вот пример:
Мой входной XML-файл
<root>
<exampleParent>
<exampleNode id="">
<!--Some stuff-->
</exampleNode>
<exampleNode id="">
<!--Some stuff-->
</exampleNode>
</exampleParent>
<exampleParent>
<exampleNode id="">
<!--Some stuff-->
</exampleNode>
</exampleParent>
</root>
Ожидаемый результат
<root>
<exampleParent>
<exampleNode id="exampleNode1">
<!--Some stuff-->
</exampleNode>
<exampleNode id="exampleNode2">
<!--Some stuff-->
</exampleNode>
</exampleParent>
<exampleParent>
<exampleNode id="exampleNode3">
<!--Some stuff-->
</exampleNode>
</exampleParent>
</root>
Моя основная трудность заключается вчто "exampleNode" не все находятся под одним и тем же родителем, но находятся по всему документу. Мне удалось изменить параметр «id» каждого «exampleNode», но я могу установить для него только определенное значение и не могу сосчитать их все.
Мой XSL-код
<xsl:variable name="prefixId" select="'exampleNode" />
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template name="setId">
<xsl:param name="nb"/>
<xsl:attribute name="id">
<xsl:value-of select="concat($prefixId, $nb)"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="exampleNode/@id">
<xsl:call-template name="setId">
<xsl:with-param name="nb"><xsl:value-of select="generate-id()"/></xsl:with-param>
</xsl:call-template>
<xsl:apply-templates select="child::node()"/>
</xsl:template>
Этот код будет генерировать уникальный идентификатор для каждого, но как я могу изменить это, чтобы этот идентификатор отражал порядок появления «exampleNode» в документе?