Ваше выражение лица :
//*[generate-id()=generate-id($myVariable[7])]/ancestor::*
правильно .
Причина, по которой он "не работает", может быть связана с тем, что $myVariable[7]
не содержит то, что вы ожидаете.
Вот простой завершенный пример с использованием приведенного выше выражения и выдачей ожидаемого. правильные результаты :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="myVariable"
select="/*/*/*/*/num"/>
<xsl:template match="/">
<xsl:for-each select=
"//*[generate-id()
=
generate-id($myVariable[7])
]
/ancestor::*
">
<xsl:value-of select="name()"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к следующему документу XML :
<a>
<b>
<c>
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
</c>
</b>
</a>
желаемый, правильный результат (имена всех предков $myVariable[7]
) получается :
a
b
c
nums