xslt – 相对于源文档中变量位置的XPath

在遍历节点集变量中的节点时,我想要一个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>&#xA;</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
点赞