Вуаля !!
Не думайте, что это встроено в XPath, вам, вероятно, понадобится рекурсивный шаблон, подобный тому здесь , на котором я основал этот пример. Он пройдется по каждому элементу в XML-документе и выведет путь к этому элементу в стиле, аналогичном тому, который вы описали.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="/">
<paths>
<xsl:apply-templates/>
</paths>
</xsl:template>
<xsl:template match="//*">
<path>
<xsl:for-each select="ancestor-or-self::*">
<xsl:call-template name="print-step"/>
</xsl:for-each>
</path>
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template name="print-step">
<xsl:text>/</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>[</xsl:text>
<xsl:value-of select="1+count(preceding-sibling::*)"/>
<xsl:text>]</xsl:text>
</xsl:template>
</xsl:stylesheet>
Есть несколько сложностей; рассмотрим это дерево:
<root>
<child/>
<child/>
</root>
Как определить разницу между двумя дочерними узлами? Итак, вам нужен некоторый индекс в вашей последовательности элементов, например, child 1 и child [2].
Вы можете использовать предок XPath Axes для обхода всех родителей, бабушек и дедушек.
<xsl:for-each select="ancestor::*">...