В XSLT1.0 вы могли бы попытаться установить переменную следующим образом:
<xsl:variable name="expression">
<xsl:for-each select="ancestor-or-self::*">
<xsl:text>/</xsl:text>
<xsl:variable name="name" select="name()"/>
<xsl:value-of select="$name"/>
</xsl:for-each>
</xsl:variable>
Итак, предполагая следующую структуру XML
<As>
<a>
<Bs>
<b>5</b>
</Bs>
</a>
<a>
<Bs>
<b>9</b>
</Bs>
</a>
<a/>
<a>
<Bs>
<b>12</b>
<b>14</b>
<b>15</b>
</Bs>
</a>
</As>
Если вы располагались на b элемент со значением 14, тогда выражение будет установлено на / As / a / Bs / b
Однако это не займетучитывать несколько узлов с одним и тем же именем, и этого будет недостаточно, если вы хотите, чтобы точный XPath выбирал узел.
Вместо этого вы можете попробовать следующее:
<xsl:variable name="expression">
<xsl:for-each select="ancestor-or-self::*">
<xsl:text>/</xsl:text>
<xsl:variable name="name" select="name()"/>
<xsl:value-of select="$name"/>
<xsl:text>[</xsl:text>
<xsl:value-of select="count(preceding-sibling::*[name() = $name]) + 1"/>
<xsl:text>]</xsl:text>
</xsl:for-each>
</xsl:variable>
Это будетreturn / As [1] / a [4] / Bs [1] / b [2] , что может быть тем, что вы хотите.