Hi Anton,
I combine grouping and filtering, and when I do that I don't get and
results.
Only thing that new output XML generates is:
<Documents>
</Documents>
I use the solution that you suggested:
<xsl:template match="Documents">
<Documents>
<xsl:for-each
select="Document[(_at_)filter=$filter]/Article[count(.|key('by-info',@info)[1])=1]">
<Document name="{(_at_)info}">
<xsl:copy-of
select="key('by-info',@info)[(_at_)filter=$filter]"/>
</Document>
</xsl:for-each>
</Documents>
</xsl:template>
The input XML looks like:
<Documents>
<Document chapter="1" title="title 1" href="file1.xml" filter="">
<Article title="1.1" info="sub" filter="food"/>
<Article title="1.2" info="main" filter="drink"/>
</Document>
<Document chapter="2" title="title 2" href="file2.xml" filter="food">
<Article title="2.1" info="sub" filter="drink"/>
<Article title="2.2" info="main" filter="food"/>
</Document>
</Documents>
thank you.
/Michael
From: Anton Triest <anton(_at_)cking(_dot_)be>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Re: [xslt transform & grouping] Using the Muenchian
Method?
Date: Thu, 30 Sep 2004 09:00:49 +0200
Michael PG wrote:
I still get empty parent nodes that are not filtered, since I left out the
info. that attribute filter is also present on the parent node. It can
also be empty or contain information.
How can I filter that away as well.
If you say you left out the info, does that mean you don't group anymore,
only filter? And in the example below, what do you want to do with Article
forename="John"? If you filter out the elements with filter='food', the
first Document will not be included. That would leave out John too,
although he has a filter='food'.
<Documents>
<Document id="0001" filter="">
<Article title="Mr"/>
<Article forename="John" filter="food"/>
<Article surname="Smith" filter=""/>
</Document>
<Document id="0002" filter="food">
<Article title="Dr"/>
<Article forename="Amy" filter=""/>
<Article surname="Jones" filter="food"/>
</Document>
</Documents>
The best solution depends on what exactly you want to do. If it's plain
filtering, a slight variation on the identity template would do:
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="*[(_at_)filter='food']"/>
</xsl:copy>
</xsl:template>
that would give:
<Documents>
<Document id="0002" filter="food">
<Article surname="Jones" filter="food"/>
</Document>
</Documents>
It might be a good idea to put the filter string in a global parameter:
<xsl:stylesheet ...>
<xsl:param name="filter" select="'food'"/>
...
<xsl:apply-templates select="*[(_at_)filter=$filter]"/>
If you still want to combine grouping and filtering, that's also possible:
<xsl:template match="Documents">
<Documents>
<xsl:for-each
select="Document[(_at_)filter=$filter]/Article[count(.|key('by-info',@info)[1])=1]">
<Document name="{(_at_)info}">
<xsl:copy-of
select="key('by-info',@info)[(_at_)filter=$filter]"/>
</Document>
</xsl:for-each>
</Documents>
</xsl:template>
Best regards,
Anton
--+------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--
_________________________________________________________________
Get ready for school! Find articles, homework help and more in the Back to
School Guide! http://special.msn.com/network/04backtoschool.armx