Hej på er, jag har ett litet problem som jag hoppas få hjälp av er att lösa.
Jag har en ganska stor och lite halvkomplicerad XML fil som jag vill sortera på en childnode-tag som ligger ganska långt ned i strukturen, output från denna sortering ska vara en identisk lika XML-fil med den enda skillnaden är att den ska vara sorterad på den här childnode-taggen.
Är detta överhuvudtaget möjligt? och hur gör man i så fall?
Tacksam för svar!
/Kaunda :h
XML sortering via XSL sort
3 svar · 1 147 visningar · startad av Kaunda
Hur långt har du kommit? Det ska absolut vara möjligt, ange helt enkelt ett element längre ner i hierarkin:
XML:
<element>
<node>
<one>
<two>...</two>
...
XSLT:
...
<xsl:template match="element">
<xsl:apply-templates>
<xsl:sort select="[b]node/one/two[/b]" />
</xsl:apply-templates>
</xsl:template>
...
Jag har börjat på en XSL som dock inte ger mig en sorterad och fungerande XML som slutprodukt tyvärr! Jag får en icke-valid XML fil där bl.a. tagnamn saknas och annat ser konstigt ut, den är heller inte sorterad på node4 som jag vill. Informationen i taggarna kommer dock ut!
Så här ser min XSL ut för tillfället (den fungerar alltså inte)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" encoding="ISO-8859-1" version="1.0"/>
<xsl:template match="node1">
<xsl:apply-templates>
<xsl:sort select="node1/node2/node3/node4" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="node1">
<xsl:value-of select="node1"/>
</xsl:template>
</xsl:stylesheet>
Jag tror att problemet ligger i din "xsl:value-of" på en hel nod.
Jag knåpade ihop ett exempel som fungerar, det skiljer sig lite från mitt tidigare inlägg dock.
bookstore.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="bookstore.xsl"?>
<bookstore>
<section name="science fiction">
<book>
<title>Foundation</title>
<author>Isaac Asimov</author>
<price>9.99</price>
</book>
<book>
<title>Hitchhikers Guide to the Galaxy, The</title>
<author>Douglas Adams</author>
<price>11.49</price>
</book>
<book>
<title>2001 A Space Odyssey</title>
<author>Arthur C. Clarke</author>
<price>8.49</price>
</book>
</section>
<section name="novels">
<book>
<title>Great Gatsby, The</title>
<author>F. Scott Fitzgerald</author>
<price>10.19</price>
</book>
<book>
<title>Lord of the Flies</title>
<author>William Golding</author>
<price>7.99</price>
</book>
</section>
<section name="fantasy">
<book>
<title>Gardens of the Moon</title>
<author>Steven Erikson</author>
<price>6.75</price>
</book>
<book>
<title>A Game of Thrones</title>
<author>George R. R. Martin</author>
<price>6.99</price>
</book>
<book>
<title>Name of the Wind, The</title>
<author>Patrick Rothfuss</author>
<price>6.19</price>
</book>
</section>
</bookstore>
bookstore.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" />
<xsl:template match="/">
<bookstore>
<xsl:for-each select="bookstore/section/book/*[name()='title']">
<xsl:sort select="." />
<book>
<title><xsl:value-of select="../title" /></title>
<author><xsl:value-of select="../author" /></author>
</book>
</xsl:for-each>
</bookstore>
</xsl:template>
</xsl:stylesheet>