Hallo,
Danke, für das Angebot, vielleicht hilft mir das weiter.
Nochmals kurz meine Problemstelung:
Ich habe viele Auftrage <DISPO> mit Beträgen in der Währung (<DIVISA>) EURO. In diesem Falle zeige ich die Summe der Aufträge in Euro an. Es kann aber auch vorkommen, dass einige Aufträge in USD oder JPY sind. Falls also in den vielen Knoten <DISPO> nicht alle Aufträge dieselbe Währung haben, kann ich natürlich keine Summe anzeigen (ich würde z.B. EUR mit JPY mischen). Also reicht mir aus dies feststellen zu können.
Natürlich wäre eine Gruppierung der Aufträge pro Währung <DIVISA> nicht schlecht...
------------------ xsl ----------------------
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="dispo" match="DISPO" use="DIVISA"/>
<xsl:template match="/DATI">
<xsl:for-each select="DISPO[generate-id(.) = generate-id(key('dispo', DIVISA)[1])]">
DISPO in : <xsl:value-of select="DIVISA"/>
<xsl:for-each select="key('dispo', DIVISA)">
Artikel: <xsl:value-of select="Artikel"/>
Peis: <xsl:value-of select="Preis"/>
</xsl:for-each>
==================
Summe in <xsl:value-of select="DIVISA"/>: <xsl:value-of select="sum(key('dispo', DIVISA)/Preis)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
------------------ ausgabe ------------------
DISPO in : EUR
Artikel: aaaa
Peis: 1110
Artikel: ccc
Peis: 2330
==================
Summe in EUR: 3440
DISPO in : CHF
Artikel: bbbb
Peis: 220
==================
Summe in CHF: 220
------------------------- erklärung -----------------
mit: <xsl:key name="dispo" match="DISPO" use="DIVISA"/>
legst du einen Schlüssel für "DISPO" an, dessen Wert "DIVISA" bildet.
Du kannst es als ein Array (oder als ein Hashtable) betrachten.
<xsl:for-each select="DISPO[generate-id(.) = generate-id(key('dispo', DIVISA)[1])]">
-
Das: "DISPO[generate-id(.)"
generiert ein ID für das jeweilige DISPO-Element. -
Das: "generate-id(key('dispo', DIVISA))"
generiert jeweils ein ID für die DISPO-Elemente im key, die den selben Wert im "DIVISA" haben wie das aktuelle DISPO-Element.
3)Das: "generate-id(key('dispo', DIVISA)[1])" generiert die ID nur für das erste Element im key, das den selben Wert im "DIVISA" hat wie das aktuelle DISPO-Element.
Ein ID wird für ein Element im Dokument immer nur einmal generiert: das heisst ein und dasselbe Element bekommt immer dieselbe ID zugewiesen, egal an welcher Stelle oder wie oft man diese ID generiert. Deshalb eignet sich die ID gut für Vergleiche.
Für die Gruppierung gilt: suche den ersten Mitlgied der Gruppe, dann finde die anderen Mitglieder der Gruppe.
Das: "generate-id(.) = generate-id(key('dispo', DIVISA)[1])"
vergleich die ID aus 1 mit dem ID aus 3.
Bei Übereinstimmung hat man den ersten Mitglied, so kann man dann DIVISA für die Gruppe ausgeben:
"DISPO in : <xsl:value-of select="DIVISA"/>"
Danach sucht man die Mitglieder der Gruppe:
"<xsl:for-each select="key('dispo', DIVISA)">"
DIVISA kommt hier von dem DISPO-Elemente, das gerade im ersten for-each abgearbeitet wird. Und weil durch den ID-Vergleich genau ein Element ausgewählt wurde, gilt das zweite for-each also für alle DISPO-Elemente im key, die den aktuellen DIVISA-Wert haben.
Dann kann man die Sachen für die einzelnen Gruppenmitglieder ausgeben:
"Artikel: <xsl:value-of select="Artikel"/>"
"Peis: <xsl:value-of select="Preis"/>"
Als letztes gab ich noch die Summe der Mitglieder der Gruppe aus:
"<xsl:value-of select="sum(key('dispo', DIVISA)/Preis)"/>"
Das: "key('dispo', DIVISA)" gilt hier ja für alle Gruppemitglieder und "key('dispo', DIVISA)/Preis" greift auf den Preis des Gruppenmitgliedes zu und sum() zählt dann das zusammen.
Grüße
Thomas