Wie mehrfach mit xsl sortieren?
Klaus
- xml
Hallo miteinander,
ich bekomme von einem Script einen XML-String übergeben, der eine Verzeichnis-Struktur darstellt.
So etwa:
************************************************
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="verzeichnisse.xsl"?>
<verzeichnisse>
<verzeichnis>
<vname>Cordner</vname>
<file>
<fname>Datei in C-Ordner</fname>
</file>
<verzeichnis>
<vname>C-Subfolder</vname>
<file>
<fname>B-Datei in C-Subfolder</fname>
</file>
<file>
<fname>A-Datei in C-Subfolder</fname>
</file>
</verzeichnis>
</verzeichnis>
<verzeichnis>
<name>Xordner</name>
</verzeichnis>
<verzeichnis>
<name>Aordner</name>
</verzeichnis>
</verzeichnisse>
************************************************
Es gibt also beliebig tief verschachtelte Verzeichnisse, deren Namen im Tag <vname> stehen. Jedes Verzeichnis
kann wieder Dateien enthalten, wobei der Name in <fname> steht.
Jetzt soll ich das ganze mit Hilfe von "verzeichnisse.xsl" sortieren und einen Verzeichnisbaum ausgeben, und zwar so, daß jeweils oben die Verzeichnisse stehen, darunter dann die Dateien, jeweils alphabetisch sortiert. Die Sortierung soll auch in den jeweiligen Unterverzeichnissen nach dieser Regel erfolgen.
Ich stehe völlig auf dem Schlauch und bekomme zwar irgendeine Ausgabe hin, aber nicht erst sortiert nach den VZ, und dann erst
nach den Dateien.
es müsste irgendwie mit apply-templates gehen, soweit bin ich gekommen.
Das ist ein erster Entwurf der Datei "Verzeichnisse.xsl".
************************************************
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="verzeichnisse">
xsl:apply-templates
<xsl:sort select="name"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="employee">
<xsl:value-of select="name()" />
</xsl:template>
</xsl:stylesheet>
************************************************
Hat jemand einen Tip für mich?
Dank & Gruss
Klaus
Hallo,
************************************************
<verzeichnisse>
<verzeichnis>
<vname>Cordner</vname>
<file>
<fname>Datei in C-Ordner</fname>
</file>
<verzeichnis>
<vname>C-Subfolder</vname>
<file>
<fname>B-Datei in C-Subfolder</fname>
</file>
<file>
<fname>A-Datei in C-Subfolder</fname>
</file>
</verzeichnis>
</verzeichnis>
<verzeichnis>
<name>Xordner</name>
</verzeichnis>
************************************************Es gibt also beliebig tief verschachtelte Verzeichnisse, deren Namen im Tag <vname> stehen.
Nicht in deinem XML! (<name>Xordner</name>)
Das ist ein erster Entwurf der Datei "Verzeichnisse.xsl".
<xsl:template match="employee">
Es gibt aber kein solches Elemente in deinem XML. Auch ein kopiertes XSL sollte auf das eigene XML angepasst werden.
Hat jemand einen Tip für mich?
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:apply-templates select="verzeichnisse/verzeichnis">
<xsl:sort select="vname" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="verzeichnis">
[<xsl:value-of select="vname" />]xsl:text

</xsl:text>
<xsl:apply-templates select="file">
<xsl:sort select="fname" />
</xsl:apply-templates>
<xsl:apply-templates select="child::verzeichnis">
<xsl:sort select="vname" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="file">
xsl:text	- </xsl:text><xsl:value-of select="fname" />xsl:text

</xsl:text>
</xsl:template>
</xsl:stylesheet>
Ausgabe mit einem korrigierten XML:
[Aordner]
[Cordner]
- Datei in C-Ordner
[C-Subfolder]
- A-Datei in C-Subfolder
- B-Datei in C-Subfolder
[Xordner]
Grüße
Thomas
Hallo,
Hat jemand einen Tip für mich?
Ich habe Deine XML-Struktur mal versuchsweise als HTML-Listenstruktur abgebildet:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="verzeichnisse">
<html>
<head>
<title>Test</title>
</head>
<body>
<xsl:apply-templates>
<xsl:sort select="vname" data-type="text" order="ascending"/>
<xsl:sort select="fname" data-type="text" order="ascending"/>
</xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="verzeichnis">
<ul>
<li><xsl:apply-templates/></li>
</ul>
</xsl:template>
<xsl:template match="file">
<ul>
<li><xsl:apply-templates/></li>
</ul>
</xsl:template>
<xsl:template match="vname">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="fname">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
Nach der Korrektur von name --> vname in den letzten beiden Verzeichniselementen kam heraus:
...
<ul>
<li>Aordner</li>
</ul>
<ul>
<li>Cordner
<ul>
<li>Datei in C-Ordner</li>
</ul>
<ul>
<li>C-Subfolder
<ul>
<li>B-Datei in C-Subfolder</li>
</ul>
<ul>
<li>A-Datei in C-Subfolder</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>Xordner</li>
</ul>
...
Das koennte etwa dem Gesuchten entsprechen.
MfG, Thomas