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

Subject: Re: [xsl] Best Way to Select Following Elements With An Ancestor?
From: Andrew Welch <andrew.j.welch@xxxxxxxxx>
Date: Sat, 22 Mar 2014 13:13:55 +0000
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 that
> 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