Subject: RE: [xsl] sort question From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 8 Sep 2006 09:06:12 +0100 |
The key thing about this transformation is that it's a "modified copy". The "modified copy" pattern is to use an identity template rule, which you've done: <xsl:template match="node() | @*"> > <xsl:copy> > <xsl:apply-templates select="node() | @*"/> > </xsl:copy> > </xsl:template> though I usually use the element-only form: <xsl:template match="*"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates select="*"/> </xsl:copy> </xsl:template> and then add a template rule for any element whose contents need to change. That's the segment element: <xsl:template match="segment"> <xsl:copy> <xsl:apply-templates> <xsl:sort select="@xml:lang"/> </xsl:apply-templates> </xsl:copy> </xsl:template> Looking at your code: <xsl:template match="/"> > <xsl:choose> > <xsl:when test="name() != segment"> Firstly, name() applied to the root node "/" will never be "segment" - the root node does not have a name. Secondly, an xsl:choose immediately inside xsl:template, especially when followed by a test on the element name, is a sure sign that you're not using template rules to their full potential - in fact you're trying to do the same thing "by hand". Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Markus Gamperl [mailto:markus.gamperl@xxxxxx] > Sent: 08 September 2006 07:46 > To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] sort question > > Dear experts! > > I get for example the following xml: > > <pub> > <segment> > <text xml:lang="en">fdasfds</text> > <text xml:lang="de">fdasfds</text> > <text xml:lang="fr">fdasfds</text> > </segment> > <segment> > <text xml:lang="fr">fdasfds</text> > <text xml:lang="de">fdasfds</text> > <text xml:lang="en">fdasfds</text> > </segment> > <segment> > <text xml:lang="fr">fdasfds</text> > <text xml:lang="en">fdasfds</text> > <text xml:lang="de">fdasfds</text> > </segment> > ... > </pub> > > For other steps I always need the german (de) then the > english (en) and at least the french (fr) text. > I tried to use xsl:sort to sort the xml:lang attribute but I > don't get it to work :-( > > The result for the example xml should look like this: > > <pub> > <segment> > <text xml:lang="de">fdasfds</text> > <text xml:lang="en">fdasfds</text> > <text xml:lang="fr">fdasfds</text> > </segment> > <segment> > <text xml:lang="de">fdasfds</text> > <text xml:lang="en">fdasfds</text> > <text xml:lang="fr">fdasfds</text> > </segment> > <segment> > <text xml:lang="de">fdasfds</text> > <text xml:lang="en">fdasfds</text> > <text xml:lang="fr">fdasfds</text> > </segment> > ... > </pub> > > I have tried the following stylesheet (and some other combinations): > > <xsl:stylesheet ...> > <xsl:template match="/"> > <xsl:choose> > <xsl:when test="name() != segment"> > <xsl:apply-templates select="node() | @*"/> > </xsl:when> > <xsl:otherwise> > <xsl:for-each select="//node()[@xml:lang]"> > <xsl:apply-templates select="node() | @*"> > <xsl:sort select="@xml:lang" > order="ascending"/> > </xsl:apply-templates> > </xsl:for-each> > <xsl:apply-templates select="node() | @*"/> > </xsl:otherwise> > </xsl:choose> > </xsl:template> > <!-- > --> > <xsl:template match="node() | @*"> > <xsl:copy> > <xsl:apply-templates select="node() | @*"/> > </xsl:copy> > </xsl:template> > </xsl:stylesheet> > > What's wrong here? > > Thanks > Markus > -- > > > Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen! > Ideal f|r Modem und ISDN: http://www.gmx.net/de/go/smartsurfer
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] sort question, Juergen | Thread | RE: [xsl] Replace new lines by <br>, Ambika.Das |
Re: [xsl] sort question, Juergen | Date | RE: [xsl] Replace new lines by <br>, Ambika.Das |
Month |