[Home] [By Thread] [By Date] [Recent Entries]
At 2006-05-23 01:48 +0300, Lassi Seppdld wrote:
I've got an XML document with multiple entries of <element> as shown below. The <name>s are unique, but the <number> can be same for mulpitle entries of <element>. The XML document isn't sorted in anyway. ... Now I need the XSL stylesheet to print out something like this: At 2006-05-22 18:28 -0500, Jay Bryant wrote:
<xsl:sort select="number"/>
T:\ftemp>xslt jay.xml jay.xsl con
<?xml version="1.0" encoding="utf-8"?>
<out>
<entry number="1">
<name>Oscar</name>
<name>Mike</name>
</entry>
<entry number="100">
<name>Tom</name>
<name>Dick</name>
<name>Harry</name>
</entry>
<entry number="25">
<name>Bob</name>
<name>George</name>
</entry>
</out>
T:\ftemp>When dealing with number values it is important to use: <xsl:sort select="number" data-type="number"/> in order for the values to not be treated as strings. I have this in one of my students' exercises (hockey standings) in order to trip them up in their reporting. So a complete solution, not using axes and not needing to have a variable would be as posted below. On large data sets this would work very much faster than using axes. I hope this helps. . . . . . . . . . . Ken T:\ftemp>type jay.xml <data>
<element>
<name>Oscar</name>
<number>1</number>
</element>
<element>
<name>Mike</name>
<number>1</number>
</element>
<element>
<name>Bob</name>
<number>25</number>
</element>
<element>
<name>George</name>
<number>25</number>
</element>
<element>
<name>Tom</name>
<number>100</number>
</element>
<element>
<name>Dick</name>
<number>100</number>
</element>
<element>
<name>Harry</name>
<number>100</number>
</element>
</data>T:\ftemp>type jay.xsl <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:key name="nbr" match="element" use="number"/> <xsl:template match="/">
<out>
<xsl:for-each select="data/element[generate-id(.)=
generate-id(key('nbr',number)[1])]"
<xsl:sort select="number" data-type="number"/>
<entry number="{number}">
<xsl:copy-of select="key('nbr',number)/name"/>
</entry>
</xsl:for-each>
</out>
</xsl:template></xsl:stylesheet> T:\ftemp>xslt jay.xml jay.xsl con
<?xml version="1.0" encoding="utf-8"?>
<out>
<entry number="1">
<name>Oscar</name>
<name>Mike</name>
</entry>
<entry number="25">
<name>Bob</name>
<name>George</name>
</entry>
<entry number="100">
<name>Tom</name>
<name>Dick</name>
<name>Harry</name>
</entry>
</out>
T:\ftemp>
|

Cart



