Muench-Methode: Wo liegt mein Fehler?
Björn
- xsl
Hallo zusammen,
ich muss folgendes xml abarbeiten:
<root>
<record a="a1" b="b1" />
<record a="a1" b="b2" />
<record a="a2" b="b3" />
</root>
Dabei soll nach dem Attribut a gruppiert werden:
<xsl:key name="aKey" match"@a" use"." />
Nun liefert aber
<xsl:value-of select="count(//record/@a[generate-id(.)=generate-id(key('aKey',.)[1])])" />
den Wert 0 und nicht wie erwartet den Wert 2 und ich kann beim besten Willen keinen Fehler finden...
Vielen Dank für jegliche Hilfe!
Björn
Hallo Björn,
Dabei soll nach dem Attribut a gruppiert werden:
<xsl:key name="aKey" match"@a" use"." />
^ ^
<xsl:key name="aKey" match="@a" use="." />
den Wert 0 und nicht wie erwartet den Wert 2 und ich kann beim besten Willen keinen Fehler finden...
Dann erscheint auch 2 für die erste Gruppe.
Grüße,
Thomas
Hi Thomas,
das war nur ein Tippfehler "hier drin"... ;-)
Danke,
Björn
Hallo Björn,
das war nur ein Tippfehler "hier drin"... ;-)
Dann sehe ich das Problem nicht:
<?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="aKey" match="@a" use="."/>
<xsl:template match="/">
<html><head><title>Test</title></head>
<body>
<p>Ergebnis: <xsl:value-of select="count(//record/@a[generate-id(.)=generate-id(key('aKey',.)[1])])"/></p><!-- Ergebnis: 2 -->
</body>
</html>
</xsl:template>
</xsl:stylesheet>
BTW: Wenn XSLT 2.0 möglich ist, dann wäre xsl:for-each-group interessant und angenehmer zu verwenden.
Grüße,
Thomas
Hallo Thomas,
ich hab's gefunden! Mein Beispiel war ein vereinfachter Auszug aus dem ganzen XML-Wust... Tatsächlich sieht die Struktur eher so aus:
<root>
<set id="1">
<record a="a1" b="b1" />
<record a="a1" b="b2" />
<record a="a2" b="b3" />
</set>
<set id="2">
<record a="a1" b="b1" />
<record a="a1" b="b2" />
<record a="a2" b="b3" />
</set>
</root>
<xsl:key name="aKey" match="@a" use="." />
<xsl:value-of select="count(//set[@id='1']/@a[generate-id(.)=generate-id(key('aKey',.)[1])])" />
Der key greift aber nicht auf <set id="1"> sondern auf alle Knoten unter <root> und dann kommt's zu Komplikationen...Ich weiß nicht, ob das XSL-like ist oder ob es an meinem XSLT-Prozessor(FOP) liegt.
Danke für's drüberschauen und viele Grüße!
Björn
Hallo Björn,
<xsl:value-of select="count(//set[@id='1']/@a[generate-id(.)=generate-id(key('aKey',.)[1])])" />
Der key greift aber nicht auf <set id="1"> sondern auf alle Knoten unter <root> und dann kommt's zu Komplikationen...Ich weiß nicht, ob das XSL-like ist oder ob es an meinem XSLT-Prozessor(FOP) liegt.
Die behandelten Attribute gehören nicht zu set, sondern zu record, also:
<xsl:value-of select="count(//set[@id='1']/record/@a[generate-id(.)=generate-id(key('aKey',.)[1])])" />
Ergebnis: 2
Grüße
Thomas
Hallo Thomas,
da hast Du natürlich absolut recht und ich hab das auch gleich geändert.
Es haut bei mir trotzdem nicht hin... Mein count gibt immer 0.
Viele Grüße
Björn
Hallo Björn,
da hast Du natürlich absolut recht und ich hab das auch gleich geändert.
Es haut bei mir trotzdem nicht hin... Mein count gibt immer 0.
Klappt problemlos mit Standalone-Prozessoren wie Saxon und AltovaXML sowie in Browsern. Vermutlich fehlt etwas beim Beispielcode. Tippe auf einen Namensraum.
Grüße,
Thomas
Hi Thomas,
vielleicht liegts am FOP... Wenn ich den key auf <set> setze, dann klappt's und damit kann ich mir behelfen.
Danke auf jeden Fall!
Björn