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:19:36 -0000
On 22.07.2022 14:15, Martin Honnen martin.honnen@xxxxxx wrote:

On 22.07.2022 13:51, Roger L Costello costello@xxxxxxxxx wrote:

My XML document has an <airport> element:


<airport>
B B B B  <a>blah</a>
B B B  <b>
B B B B B B  <c>blah</c>
B B B  </b>
B B 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]


I think XPath 3 also allows you


B B airport/innermost(.//*)[position() le 10]

Current Thread