Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries >Thread Prev - Matching nodes based on attributes in another node-set [Thread Next] Re: Matching nodes based on attributes in another node-setTo: NULL Date: 8/11/2009 7:46:00 PM Barnum wrote:
> Hi,
>
> this sounds like an easy thing, but I haven't managed to find a
> solution....
> What I want to do is to select the nodes in a node-set that has a
> value that exists as an attribute in another node-set. Example:
>
> First node-set (in xsl variable 'fruits'):
> <fruit>
> <name>apple</name>
> <color>green</color>
> </fruit>
> <fruit>
> <name>banana</name>
> <color>yellow</color>
> </fruit>
>
>
> Second node-set (in xsl variable 'colors'):
> <color @name="green" />
> <color @name="red" />
>
> Failed attempt at selecting, but it gives a hint on what I want to do:
> <xsl:value-of select="$fruits/fruit[color=$colors/color/@name]"/>
> I would expect to get back
> <fruit>
> <name>apple</name>
> <color>green</color>
> </fruit>
It all depends on how exactly you set up your variables and you have not
shown that.
Assuming the XML is as follows:
<root>
<fruit>
<name>apple</name>
<color>green</color>
</fruit>
<fruit>
<name>banana</name>
<color>yellow</color>
</fruit>
<color name="green" />
<color name="red" />
</root>
then this stylesheet
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<xsl:variable name="fruits" select="root/fruit"/>
<xsl:variable name="colors" select="root/color"/>
<xsl:copy-of select="$fruits[color = $colors/@name]"/>
</xsl:template>
</xsl:stylesheet>
will give the result you describe.
If you change the XML to
<root>
<fruits>
<fruit>
<name>apple</name>
<color>green</color>
</fruit>
<fruit>
<name>banana</name>
<color>yellow</color>
</fruit>
</fruits>
<colors>
<color name="green" />
<color name="red" />
</colors>
</root>
then the following stylesheet uses the expression you posted originally:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<xsl:variable name="fruits" select="root/fruits"/>
<xsl:variable name="colors" select="root/colors"/>
<xsl:copy-of select="$fruits/fruit[color=$colors/color/@name]"/>
</xsl:template>
</xsl:stylesheet>
--
Martin Honnen --- MVP XML
http://msmvps.com/blogs/martin_honnen/
| ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
