Re: [xsl] XPath expression that returns the first 10 leaf element within the airport element?

Subject: Re: [xsl] XPath expression that returns the first 10 leaf element within the airport element?
From: "Martin Honnen martin.honnen@xxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 22 Jul 2022 12:15:38 -0000
On 22.07.2022 13:51, Roger L Costello costello@xxxxxxxxx wrote:

My XML document has an <airport> element:


<airport>
     <a>blah</a>
    <b>
       <c>blah</c>
    </b>
    ...
</airport>

I want the first 10 leaf elements within the <airport> element (<a>, <c>,
...).

I thought this XPath would do the job:


<xsl:for-each select="airport//*[not(child::*)][position() le 10]">

But that XPath does not return the first 10 leaf elements. It returns over
nine thousand elements!

What is that XPath expression saying? Clearly it is saying something
different than I thought it was saying.

I think I found the correct XPath expression:


<xsl:for-each select="(airport//*[not(child::*)])[position() le 10]">

Do you agree that that XPath expression will select the first 10 leaf
elements within the <aircraft> element?

An easy to make mistake with positional predicates and // in your
initial attempt but you corrected it well.

I sometimes tend to avoid the trap doing

B airport/descendant::*[not(*)][position() le 10]

Current Thread