Subject: RE: [xsl] Sibling axis: All of kind A up to first of kind B From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Wed, 26 Mar 2008 21:57:11 -0000 |
> >> <xsl:apply-templates mode="toc" > >> select="(following-sibling::h1 | > following-sibling::h2)[ 1 > >> ]"/> > > > > Might be safer to do following-sibling::*[self::h1 or > self::h2][1] - > > but depends on the processor. > > Why might this be safer? Aren't the resulting node-sets the > same and the expressions therefore equivalent? Doesn't the > union operator impose document order? Well, I've no way of knowing, but it occurred to me that there might be processors that fail to recognize that the two operands of the union operator are both sorted node-sets and that the operation can therefore be done by a fully-streamed merge, stopping as soon as either node-set delivers a node. Streamed execution of the second expression requires much less analysis. Saxon copes well with it, however: Analyzing query from {(following-sibling::h1|following-sibling::h2)[1]} Analysis time: 9544 milliseconds <?xml version="1.0" encoding="UTF-8"?> <query> <body> <firstItem> <axis name="following-sibling" nodeTest="(element(h1, xs:anyType) | element(h2, xs:anyType))"/> </firstItem> </body> </query> The expression tree generated by the Saxon optimizer is in effect first(following-sibling::(h1|h2)) which is roughly what I suggested you should write. This will do a single scan of the following sibling axis looking for h1 and h2 elements, and return the first one it finds: no merging needed. Michael Kay http://www.saxonica.com/
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Sibling axis: All of kind, Michael Ludwig | Thread | Re: [xsl] Sibling axis: All of kind, Michael Ludwig |
Re: [xsl] Sibling axis: All of kind, Michael Ludwig | Date | [xsl] Grouping: XHTML inline, block, Raka Gator |
Month |