Re: [xsl] Just the first 'x' elements within a for-each

Subject: Re: [xsl] Just the first 'x' elements within a for-each
From: Simon.Fairey@xxxxxx
Date: Tue, 18 Mar 2003 14:15:05 +0000
Jeni,

Ah I see, I'm beginning to get the picture, the second version worked but 
the first didn't and after a good look I realised it's due to the nature 
of the data and the fact there is only one properties element per story 
element. What I wanted (as the second example shows) is the properties 
element of the first 2 story elements rather than just the first 2 
properties elements.

Many thanks

Si




Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
18/03/2003 14:01
Please respond to Jeni Tennison

 
        To:     Simon.Fairey@xxxxxx
        cc:     xsl-list@xxxxxxxxxxxxxxxxxxxxxx
        Subject:        Re: [xsl] Just the first 'x' elements within a for-each


Hi Si,

> The following displays all the headlines rather than just the first 2:
>
> <xsl:stylesheet version="1.0"
>                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> <xsl:output method="html"/>
> <xsl:template match="/">
>     <xsl:for-each select="/package/stories/story/properties[position() 
&lt;= 2]">
>       <!-- We only want the first 2 headline -->
>       <br/>
>       <xsl:value-of select="headline"/>
>     </xsl:for-each>
>   </xsl:template>
> </xsl:stylesheet>

Ah, right -- the position that's used in the predicate here applies to
the position of the <properties> element within its <story> parent,
rather than the position of the <properties> element amongst all the
<properties> elements (within <story> elements, within...) in the
document.

You just need to add some brackets:

  <xsl:for-each select="(/package/stories/story/properties)[position() 
&lt;= 2]">
    ...
  </xsl:for-each>

this will collect up the <properties> elements into a node set and the
position of a particular <properties> element will be judged based on
its position, in document order, amongst the other nodes in that node
set.
 
Or (depending on the structure of the XML) you might be able to move
the predicate so that it's getting the position of the right thing.
For example, perhaps you want the <properties> children of the first
two <story> elements:

  <xsl:for-each select="/package/stories/story[position() &lt;= 
2]/properties">
    ...
  </xsl:for-each>

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/






**********************************************************************************
This email may contain confidential material. If you were not an
intended recipient, please notify the sender and delete all copies.
We may monitor email to and from our network.


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread