Getting the POSITION() of the PARENT node using Xpath
I just spent waaaaaay too long figuring this out, so I'll leave a note of it for future projects:
To enumerate the current node's position in the current nodeset, position() is great. However when using nested nodesets, getting the parent's position relative to its nodeset is a bit more complex:
count(parent::*/preceding-sibling::*) + 1 - assuming all nodes in the parent nodeset are of the same type, otherwise:
count(parent::*/preceding-sibling::<type>) + 1 where <type> is the type of the parent node
A quick beakdown:
- parent::* - selects the parent of the current node
- parent::*/preceding-sibling::* - selects the nodes which precede the parent in its nodeset
- count(parent::*/preceding-sibling::*) - counts the nodes preceding the parent
- count(parent::*/preceding-sibling::*) + 1 - if there are n nodes before the parent, then the parent is # n+1
Comments
- Anonymous
September 07, 2004
Yeah,
pretty much same as:
count(../preceding-sibling::node()) + 1
Checking for type is reasonable to avoid counting whitespace nodes.
Great post! - Anonymous
November 03, 2004
For the second time in the last month I've bumped into a problem, googled it, clicked on a link to Addy's blog, and found the perfect solution. Getting the POSITION() of the PARENT node using Xpath XmlDocument.CreateProcessingInstruction goes better with... - Anonymous
May 30, 2009
PingBack from http://outdoorceilingfansite.info/story.php?id=2207 - Anonymous
June 03, 2009
PingBack from http://castironbakeware.info/story.php?title=santomania-getting-the-position-of-the-parent-node-using-xpath - Anonymous
June 16, 2009
PingBack from http://topalternativedating.info/story.php?id=13201