Re: [xsl] Best Way to Select Following Elements With An Ancestor?

Subject: Re: [xsl] Best Way to Select Following Elements With An Ancestor?
From: Eliot Kimber <ekimber@xxxxxxxxxxxx>
Date: Sat, 22 Mar 2014 08:27:30 -0500
I was somehow unaware of the after (>>) operator. That does seem to
express exactly the test I need to make. (Note to self: find time to do a
careful reading of the XQuery and XPath 2.0 Functions and Operators spec.)

So I guess the question would be whether or not a particular XSLT
processor (e.g., Saxon in my case) would be more or less efficient using
the after operation or using keys?


Eliot Kimber, Owner
Contrext, LLC

On 3/22/14, 8:13 AM, "Andrew Welch" <andrew.j.welch@xxxxxxxxx> wrote:

>On 22 March 2014 12:46, Eliot Kimber <ekimber@xxxxxxxxxxxx> wrote:
>> I have a document where each child of the root element establishes a
>> unique content with regard to the output result (in this case,
>> corresponding to InDesign frames).
>> For a given descendant of one of these elements I need to know if there
>> are any following elements within the same context. So simply doing
>> following::* won't work and the following elements I'm checking for need
>> not be siblings of the current element.
>> The solution I arrived at is:
>> <xsl:variable name="myDitaAncestor" select="ancestor::dita"
>> as="element()*"/>
>>     <xsl:variable name="followingWithinDita" as="element()*"
>>   select="following::*[count(ancestor::dita | $myDitaAncestor) = 1]"
>>     />
>> This works but I'm wondering if there's a better solution, either one
>> is more efficient or one that is more elegant?
>I don't know if it's more efficient or more elegant, but you could do:
>$myDitaAncestor//* >> current()
>Keying elements by their <dita> ancestor might help, eg
>key name="elems-by-dita" match="*" use="generate-id(ancestor::dita)"
>key('elems-by-dita', $dita-id) >> current()
>where $dita-id is the generate-id() of the dita ancestor passed down
>as a tunnelled param.
>Andrew Welch

Current Thread