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: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 22 Jul 2022 14:12:03 -0000
It's not a basic question but it is one that is usually asked only by
beginners: most people fall into this trap once, and then steer clear of it in
future.

The operator `[]` has higher precedence than `/`, so $a/b[1] finds the first b
child of every element selected by $a.

Michael Kay
Saxonica

> On 22 Jul 2022, at 12:51, Roger L Costello costello@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Hi Folks,
>
> I have an embarrassingly basic question.
>
> 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?
>
> /Roger

Current Thread