| Subject: Re: [xsl] extract the right elements From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Tue, 30 Sep 2003 12:52:47 +0100 | 
Hi Clemens,
> <xsl:for-each select="//INSTANCE[@class='Audio' or @class='Web-Site']">
>     <xsl:for-each select="key('tracker','Position')">
>         <item>
>             <xsl:attribute name="identifierref">
>                 <xsl:value-of select="."/>
>             </xsl:attribute>
>             <title>
>                 <xsl:value-of select="parent::INSTANCE/@name"/>
>             </title>
>         </item>
>     </xsl:for-each>
> </xsl:for-each>
The key() function returns the nodes with a certain value for a
particular key. In the above, key('tracker', 'Position') will always
return the same node-set: all the nodes that, on the 'tracker' key,
have the value 'Position'. So you get an <item> for each of those
nodes, for each of the <INSTANCE> elements whose class is 'Audio' or
class is 'Web-Site'.
> the problem is, that i don't want to use it on all "instance"
> elements, but only on those whose class attributes are either
> 'Audio' or 'Web-Site', but the first for-each loop that is meant to
> fulfill this purpose simply doesn't work, instead it always runs the
> loop for all "instance" elements.
It sounds as though you want to filter the elements that are being
returned by the key, to only include those whose parent <INSTANCE>
element has a class of 'Audio' or 'Web-Site'. In that case, you need
to apply the filter (the predicate) to the node-set returned by the
key() function, as follows:
  <xsl:for-each select="key('tracker', 'Position')
                          [parent::INSTANCE/@class = 'Audio' or
                           parent::INSTANCE/@class = 'Web-Site']">
    ...
  </xsl:for-each>
On the other hand, I'm not sure why you're using the key() at all
here. I think that you could get the result that you want (from the
previous thread) with:
  <xsl:for-each select="INSTANCE[@class = 'Audio' or
                                 @class = 'Web-Site']">
    <item identifier="{ATTRIBUTE[@name = 'Position']}">
      <xsl:value-of select="@name" />
    </item>
  </xsl:for-each>
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
| Current Thread | 
|---|
| 
 | 
| <- Previous | Index | Next -> | 
|---|---|---|
| [xsl] extract the right elements, clemens schrenk | Thread | Re: [xsl] extract the right element, David Carlisle | 
| Re: [xsl] restructuring element hie, james walker | Date | [xsl] Re: restructuring element hie, Dimitre Novatchev | 
| Month |