dynamische Liste erzeugen
c300
- xsl
0 Thomas J.S.0 c3000 c3000 Thomas J.S.0 c3000 Thomas J.S.0 c300
Hallo,
Ich habe eine XML-Struktur:
<root>
<user>
<dauer>5</dauer>
<name>Peter</name>
</user>
<user>
<dauer>3</dauer>
<name>Paul</name>
</user>
<user>
<dauer>5</dauer>
<name>Martin</name>
</user>
<user>
<dauer>1</dauer>
<name>Fred</name>
</user>
...
</root>
Nun möchte ich mittels XSL-Transformation eine (Auswahl-)Liste erzeugen, die für jeden vorkommenden Wert im Knoten <dauer> einen Eintrag enthält. Dabei soll aber jeder Wert nur einmal vorkommen. D.h. im obigen Fall sollte die Liste dann
1
3
5
lauten. Wie kann ich ein entsprechendes Kontenset bilden? Die Sortierung sollte dann kein Problem sein. Habt Ihr mir vielleicht einige Ansatzpunkte zum Weiterdenken?
Danke und Grüsse
c300
Hallo,
Ich habe eine XML-Struktur:
<root>
<user>
<dauer>5</dauer>
<name>Peter</name>
</user>
...
</root>Nun möchte ich mittels XSL-Transformation eine (Auswahl-)Liste erzeugen, die für jeden vorkommenden Wert im Knoten <dauer> einen Eintrag enthält. Dabei soll aber jeder Wert nur einmal vorkommen. D.h. im obigen Fall sollte die Liste dann
lauten. Wie kann ich ein entsprechendes Kontenset bilden? Die Sortierung sollte dann kein Problem sein. Habt Ihr mir vielleicht einige Ansatzpunkte zum Weiterdenken?
Mit XSLT 1.0
---------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="dauer" match="user" use="dauer"/>
<xsl:template match="/">
<html>
<head>
<title />
</head>
<body>
<xsl:apply-templates select="root" />
</body>
</html>
</xsl:template>
<xsl:template match="root">
<select>
<xsl:for-each select="user[generate-id(.) = generate-id(key('dauer', dauer))]">
<xsl:sort select="dauer" data-type="number"/>
<option>
<xsl:value-of select="dauer"/>
</option>
</xsl:for-each>
</select>
</xsl:template>
</xsl:stylesheet>
------------
In XSLT 2.0:
------------
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<html>
<head>
<title />
</head>
<body>
<xsl:apply-templates select="root" />
</body>
</html>
</xsl:template>
<xsl:template match="root">
<select>
<xsl:for-each-group select="user" group-by="dauer">
<xsl:sort select="current-grouping-key()" data-type="number" />
<option>
<xsl:value-of select="current-grouping-key()" />
</option>
</xsl:for-each-group>
</select>
</xsl:template>
</xsl:stylesheet>
Erzeugt (beide):
-----------------------------
<html>
<head>
<title></title>
</head>
<body>
<select>
<option>1</option>
<option>2</option>
<option>3</option>
<option>5</option>
</select>
</body>
</html>
Grüße
Thomas
Hallo,
Danke, so ausführlich hatte ich das gar nicht erwartet. Kennst Du einen Link, wo ich ein XSLT 2.0 Tutorial analog dem von SelfHTML finde?
Gruss
c300
Hallo,
Ich hab noch ein weiteres Problem, ich meine irgendwo gelesen zu haben, dass man vor einer Transformation Parameter an ein Stylesheet übergeben kann (unter Java), leider finde ich dies nicht mehr. Weiss hier evtl auch jemand weiter?
Danke
c300
Hallo,
"Kennst Du einen Link, wo ich ein XSLT 2.0 Tutorial analog dem von SelfHTML finde?"
Nein.
Am ehesten findest du noch was unter http://www.w3schools.com/xsl/default.asp oder unter http://zvon.org/xxl/XSL-Ref/Tutorials/index.html (wobe das nicht so ganz aktuell ist).
Ich hab noch ein weiteres Problem, ich meine irgendwo gelesen zu haben, dass man vor einer Transformation Parameter an ein Stylesheet übergeben kann (unter Java), leider finde ich dies nicht mehr. Weiss hier evtl auch jemand weiter?
Tja, das kommt darauf an was und wie du machst. Was meinst du mit Java?
Eine Java-Programm (oder z.B: ein Jar-File) oder ein Servlet?
Wenn der Transformer defnier ist kannst du mit transformer.setParameter(String name, String value); Parameter an das XSL übergeben.
Grüße
THomas
Hallo Thomas,
Danke für die Links. Ich spreche von einem Servlet und habe ebendiesen Weg über setParameter() gefunden.
Ich denke, jetzt habe ich nur noch ein letztes Problem:
Gibt es eine Variante, einfach auf ein Element zuzugreifen, welches ein Kind hat, das gewisse Bedingungen erfüllt?
Konkret möchte ich auf ein <user> zugreifen, der im Kindelement <id> einen eindeutigen, bekannten Wert hat. Wäre diese ID ein Attribut, wäre das ja kein Problem... Leider lässt sich aber das XML nicht verändern. So fällt mir eine Schleife ein, das kanns ja aber wohl kaum sein. Deine XSL 2.0 Variante for-each-group hilft ja auch nicht, da jede meiner so erzeugten Gruppen genau ein Element enthielte...
Danke und Gruss
c300
Hallo,
Ich denke, jetzt habe ich nur noch ein letztes Problem:
Gibt es eine Variante, einfach auf ein Element zuzugreifen, welches ein Kind hat, das gewisse Bedingungen erfüllt?Konkret möchte ich auf ein <user> zugreifen, der im Kindelement <id> einen eindeutigen, bekannten Wert hat. Wäre diese ID ein Attribut, wäre das ja kein Problem... Leider lässt sich aber das XML nicht verändern. So fällt mir eine Schleife ein, das kanns ja aber wohl kaum sein. Deine XSL 2.0 Variante for-each-group hilft ja auch nicht, da jede meiner so erzeugten Gruppen genau ein Element enthielte...
Ich verstehe dei Frage nicht wirklich. Mir ist nicht klar was du erreichen möchtest.
Die Ausagbe der Gruppe enthält natürlich nur ein Element aus der gefundenen Gruppe.
Grüße
Thomas
Hallo,
Ich habs dank Deinem Link auf die Reihe gebracht. Ich suchte nach root/user[id = $ID]...
Danke trotzdem, Grüsse
c300