Subject: RE: 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/
|