RE: [xsl] sorted for-each: preceding::sibling is not in sort order

Subject: RE: [xsl] sorted for-each: preceding::sibling is not in sort order
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sun, 13 Nov 2005 16:11:14 -0000
> Working on a grouping problem I was trying to use preceding::sibling
> on a selection of nodes that I had assembled with for-each and sorted.
> 
> It took me a long time to find out that while for-each will 
> present the
> nodes in sort order, preceding::sibling will give me the
> results for a totally different node (probably document order).
> 
> Is this intended behaviour 

Yes. A node has a fixed position in a tree. A tree is immutable: you cannot
change the parent, children, or siblings of an existing node. The axes all
relate to the relationship of the node to other nodes in the same tree.

xsl:sort affects the processing order of the nodes (or in XSLT 2.0, the
ordering of a sequence of nodes) but it does not affect the node's axis
relationships.

> And if 
> so, what is
> the best way around this. The only way I found was to do a first
> for-each copy-of all the nodes into a variable, then work with the
> content of the variable in a second for-each using that variable.
> 
> One big disadvantage being that I'm cutting off all the parent
> relationships when copying my node.

Yes, in 1.0 that's a problem. XSLT 2.0 allows you to use xsl:sequence
instead of xsl:copy-of, so you can construct a variable whose value is a
sequence of nodes (node references) without making copies of the nodes.

Michael Kay
http://www.saxonica.com/

Current Thread