Sortierproblem? (2. Stufe)
Cyberfuzzy
- xsl
0 hh0 Thomas J.S.
Hallo,
ich habe ja letzte Woche schon eine super Hilfe wegen einem XSL Sortierproblem bekommen.
Jetzt bin ich an der nächsten Stufe angelangt, wo ich mal wieder nicht weiter weiß.
Ausgangs XML:
<test>
<AREA1>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<TEIL>10</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<TEIL>20</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<TEIL>30</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<TEIL>40</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>10080</ARTIKEL>
<TEIL>60</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>10080</ARTIKEL>
<TEIL>70</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>10080</ARTIKEL>
<TEIL>80</TEIL>
</DATENSATZ>
</AREA1>
<AREA2>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<DOKUMENT>1030</DOKUMENT>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<DOKUMENT>1040</DOKUMENT>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>10080</ARTIKEL>
<DOKUMENT>1090</DOKUMENT>
</DATENSATZ>
</AREA2>
</test>
Das XSL soll so sortieren, dass ich hinterher folgendes herausbekomme:
Artikel: 12345 / dazugehörige Teile: 10, 20, 30, 40 / Dokumente: 1030, 1040
Artikel: 10080 / dazugehörige Teile: 60, 70, 80 / Dokumente: 1090
Das Problem ist hier, dass sich die Dokumente weiter unten in der XML in einer anderen Area befinden. Gibt es hierfür überhaupt eine Möglichkeit?
Danke schonmal :-)
Grüße
Cyberfuzzy
--
http://www.cyberfuzzy.com
Hi,
es gibt vielleicht auf noch elegantere Lösungen, aber diese sollte funktionieren ;-)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
<xsl:key name="datensatz" match="*" use="ARTIKEL"/>
<xsl:template match="/">
<xsl:for-each
select="/*/*/DATENSATZ[generate-id() = generate-id(key('datensatz', ARTIKEL)[1])]">
<xsl:sort select="ARTIKEL" data-type="number"/>
<xsl:variable name="currentArtikel" select="ARTIKEL"/> Artikel: <xsl:value-of
select="ARTIKEL"/> / dazugehörige Teile: <xsl:for-each
select="/*/AREA1/DATENSATZ[ARTIKEL = $currentArtikel]">
<xsl:sort select="TEIL" order="ascending"/>
<xsl:value-of select="TEIL"/>; </xsl:for-each> / dazugehörige Dokument:
<xsl:sort select="DOCUMENT" order="ascending"/>
<xsl:for-each select="/*/AREA2/DATENSATZ[ARTIKEL = $currentArtikel]">
<xsl:value-of select="DOKUMENT"/>; </xsl:for-each><br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Gruß,
Holger
Hallo,
ich habe ja letzte Woche schon eine super Hilfe wegen einem XSL Sortierproblem bekommen.
Jetzt bin ich an der nächsten Stufe angelangt, wo ich mal wieder nicht weiter weiß.
Ausgangs XML:
<test>
<AREA1>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<TEIL>10</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<TEIL>20</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<TEIL>30</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<TEIL>40</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>10080</ARTIKEL>
<TEIL>60</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>10080</ARTIKEL>
<TEIL>70</TEIL>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>10080</ARTIKEL>
<TEIL>80</TEIL>
</DATENSATZ>
</AREA1>
<AREA2>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<DOKUMENT>1030</DOKUMENT>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>12345</ARTIKEL>
<DOKUMENT>1040</DOKUMENT>
</DATENSATZ>
<DATENSATZ>
<ARTIKEL>10080</ARTIKEL>
<DOKUMENT>1090</DOKUMENT>
</DATENSATZ>
</AREA2>
</test>Das XSL soll so sortieren, dass ich hinterher folgendes herausbekomme:
Artikel: 12345 / dazugehörige Teile: 10, 20, 30, 40 / Dokumente: 1030, 1040
Artikel: 10080 / dazugehörige Teile: 60, 70, 80 / Dokumente: 1090Das Problem ist hier, dass sich die Dokumente weiter unten in der XML in einer anderen Area befinden. Gibt es hierfür überhaupt eine Möglichkeit?
Danke schonmal :-)
Grüße
Cyberfuzzy
Hallo hh,
etwas OT hier: es geht um deine Frage zu Schema:
ich denke nicht, dass was du erreichen möchtest möglich ist. Jedoch ist diese Ansicht nur das Ergebnis vom Nachdenken, d.h. ich habe keine Test dazu gemacht. Da ich dazu auch nicht die Zeit habe, würde ich dir empfehlen in der xmldev-Mailing-Liste http://www.xml.org/xml/xmldev.shtml nachzufragen, ev. hat jemand dort einen Lösungsvorschlag.
Grüße
Thomas
Hallo,
Jetzt bin ich an der nächsten Stufe angelangt, wo ich mal wieder nicht weiter weiß.
Das XSL soll so sortieren, dass ich hinterher folgendes herausbekomme:
Artikel: 12345 / dazugehörige Teile: 10, 20, 30, 40 / Dokumente: 1030, 1040
Artikel: 10080 / dazugehörige Teile: 60, 70, 80 / Dokumente: 1090Das Problem ist hier, dass sich die Dokumente weiter unten in der XML in einer anderen Area befinden. Gibt es hierfür überhaupt eine Möglichkeit?
Dann setzen wir das XSL dort fort, wo es aufgehört hat und machen wir drei kleine Ergänzungen:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="datensatz" match="DATENSATZ" use="ARTIKEL" />
<xsl:template match="/test">
<html>
<head>
<title>Untitled</title>
</head>
<body>
<xsl:for-each select="AREA1/DATENSATZ[generate-id() = generate-id(key('datensatz', ARTIKEL)[1])]">
<xsl:sort select="ARTIKEL" data-type="number" />
Artikel: <xsl:value-of select="ARTIKEL" /> / dazugehörige Teile:
<xsl:for-each select="key('datensatz', ARTIKEL)[ancestor::AREA1]">
<xsl:value-of select="TEIL" />
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
/ Dokumente:
<xsl:for-each select="key('datensatz', ARTIKEL)[ancestor::AREA2]">
<xsl:value-of select="DOKUMENT" />
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
<br />
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Du kannst statt:
<xsl:for-each select="AREA1/DATENSATZ[generate-id() = generate-id(key('datensatz', ARTIKEL)[1])]">
auch: <xsl:for-each select="//DATENSATZ ... nehmen,
Grüße
Thomas