webForumDet fria alternativet

XML sortering via XSL sort

3 svar · 1 147 visningar · startad av Kaunda

KaundaMedlem sedan feb. 20103 inlägg
#1

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

SPiNMedlem sedan mars 20007 896 inlägg
#2

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>
...
KaundaMedlem sedan feb. 20103 inlägg
#3

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>

SPiNMedlem sedan mars 20007 896 inlägg
#4

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>
126 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)