[xsl] filtering elements by single xpath

Subject: [xsl] filtering elements by single xpath
From: "Tomas Kolaci" <kolaci@xxxxxxx>
Date: Wed, 5 Apr 2006 16:45:51 +0200
 Hi!

 I'm using XSLT 1.1 and Saxon 6.5.3.

 I have following XML structure:

<root>
   <body>
      <item pos="1" name="n1"/>
      <item pos="2" name="n2"/>
      <item pos="3" name="n2"/>
      <item pos="4" name="n3"/>
      <item pos="5" name="n4"/>
   </body>
   <item-filter>
      <allow-items with-name="n2"/>
      <allow-items with-name="n4"/>
   </item-filter>
</root>

and in template:

<xsl:template match="body">
   <xsl:variable
     name="filtered-items"
     select="item[/root/item-filter/allow-items[@with-name = ???/@name]"
   />
   ...
</xsl:template>

I'm trying to fill variable filtered-items with elements item with "allowed"
name (= there is an element /root/item-filter/allow-items with attribute
@with-name containing same value as item's @name)*, but I don't know how to
reach current item on ??? position in my select (function current() points
to current body element).

 I can handle it by sequential processing (copy of item is good enough for
my needs):

<xsl:variable name="filtered-items">
   <xsl:for-each select="item">
      <xsl:if
        test="/root/item-filter/allow-items[@with-name = current()/@name]">
         <xsl:copy-of select="."/>
      </xsl:if>
   </xsl:for-each>
</xsl:variable>

but I'm just curious if it is possible to achieve this by single xpath?

 Thanks in advance!

 Best regards, Tomas

*resultant filtered-items content for given example should be:

<item pos="2" name="n2"/>
<item pos="3" name="n2"/>
<item pos="5" name="n4"/>

Current Thread