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