JPM
JPM

Reputation: 2066

XPath relative to variable's location in source document

When iterating through the nodes in a node-set variable I want an XPATH 1.0 expression that returns all ancestors of a node (e.g., of $myVariable[7]) -- not the ancestors in the node-set variable, but ancestors in the original document.

I thought one of these would work, but neither does.

select="//*[generate-id()=generate-id($myVariable[7])]/ancestor::*"
select="id(generate-id($myVariable[7]))/ancestor::*"

Am I close?

Edit: It's not central to my question, but I had //ancestor; that extra slash is unnecessary.

Upvotes: 4

Views: 289

Answers (1)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243549

Your expression:

//*[generate-id()=generate-id($myVariable[7])]/ancestor::*

is correct.

The reason it is "not working" may be due to the fact that $myVariable[7] doesn't contain what you are expecting.

Here is a simple complete example using the above expression and producing the expected. correct results:

<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>

when this transformation is applied on the following XML document:

<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>

the wanted, correct result (the names of all ancestors of $myVariable[7]) is produced:

a
b
c
nums

Upvotes: 2

Related Questions