FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

XML sortieren... mit XSLT?

XML sortieren... mit XSLT? 2008-08-06 07:31
Anonymer User
Hallo,
ich suche gerade nach einem Weg eine XML-Datei zu sortieren.
D.h. ich will das die Namen aller Elementknoten in allen Ebenen alphabetisch sortiert sind.

XSLT scheint mir da sehr geeignet, also per xsl:sort.
So weit bin ich schon:
<xsl:template match="//*" name="schleife"> <xsl:for-each select="*"> <xsl:sort select="name()" order="ascending" /> <xsl:copy-of select="." /> <xsl:call-template name="schleife" /> </xsl:for-each> </xsl:template> Was aber nicht wirklich das gewünschte Ergebnis zur Folge hat, da der Punkt (.) wohl die node inkl. der childs selektiert.

Frage:
Hat jemand mehr Ahnung von XSLT und kann mir helfen, oder kennt jemand generell eine bessere/schnellere/einfachere Lösung meines Problems?

Danke schonmal!!

RE: XML sortieren... mit XSLT? 2008-08-06 07:52
Slater
ich hab zwar auch nicht viel Ahnung, aber immer einige Zeit um Ausprobieren,
gib doch mal ein möglichst kurzes XML-Beispiel als Eingabe und die gewünschte Ausgabe + evtl. was dein Code bisher draus macht

RE: XML sortieren... mit XSLT? 2008-08-06 11:22
Sven Port
Vielleicht hilft das:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="UTF-8"/> <xsl:template match="RootNameOfYourXML"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:call-template name="sortABC"> <xsl:with-param name="startNode" select="node()"/> </xsl:call-template> </xsl:copy> </xsl:template> <xsl:template name="sortABC"> <xsl:param name="startNode"/> <xsl:for-each-group select="node()" group-by="string(name())"> <xsl:sort select="string(name())"/> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:call-template name="sortABC"> <xsl:with-param name="startNode" select="node()"/> </xsl:call-template> </xsl:copy> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>

RE: XML sortieren... mit XSLT? 2008-08-06 23:38
Anonymer User
Hi Sven,
vielen Dank für den Schnipsel, das hat geholfen.
Ich mußte bei mir nur xsl:for-each-group mit xsl:for-each ersetzen uns es funktionierte tadellos.

@Slater: trotzdem Danke :)

RE: XML sortieren... mit XSLT? 2008-08-21 20:00
Anonymer User
Hi,
das ganze funktioniert sehr gut bei recht simplen XML-Strukturen, allerdings leistet die Sortierung kein Ergebnis bei z.B. folgender Struktur:

<mensch> <frau> <name>marta</name> <lieblingsos>linux</lieblingsos> </frau> <frau> <name>babsi</name> </frau> </mensch>
Eigentlich ist mir egal wierum er hier frau sortieren würde, hauptsache er macht es immer auf die gleiche weise, also z.B. erst nach child-anzahl und dann lexikografisch nach name-value.
Stehe da komplett auf dem Schlauch… aber vielleicht ist das auch zu komplex für xslt..?