Björn: Muench-Methode: Wo liegt mein Fehler?

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

  1. 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

    1. Hi Thomas,

      das war nur ein Tippfehler "hier drin"... ;-)

      Danke,
      Björn

      1. 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

        1. 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

          1. 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

            1. 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

              1. 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

                1. 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