在遍历节点集变量中的节点时,我想要一个XPATH 1.0表达式,它返回节点的所有祖先(例如,$myVariable [7]) – 不是节点集变量中的祖先,而是祖先中的祖先原始文件.
我认为其中一个可行,但两者都没有.
select="//*[generate-id()=generate-id($myVariable[7])]/ancestor::*"
select="id(generate-id($myVariable[7]))/ancestor::*"
我接近了吗?
编辑:这不是我的问题的核心,但我有//祖先;额外的斜线是不必要的.
最佳答案 你的表达:
//*[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