Announcement

Collapse
No announcement yet.

Verschachteltes Count

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verschachteltes Count

    Hallo,

    ich möchte in XSLT mit "count" herausfinden, wie viele Seiten eines Buches einen bestimmten Wert bei einem bestimmten Attribut haben.

    In dem unteren Beispiel hätte ich gerne bei "book1" das Ergebnis "2", wenn ich schaue wie viele Seiten beim "attr1" den Wert "value1" stehen haben.

    HTML Code:
    <root>
      <books>
        <book id="book1">
          <page ref="page1" />
          <page ref="page2" />
          <page ref="page3" />
          <page ref="page2" />
        </book>
        <book id="book2">
          <page ref="page3" />
          <page ref="page2" />
        </book>
      </books>
      <pages>
        <page id="page1">
          <attribute name="attr1">value1</attribute>
        </page>
        <page id="page2">
          <attribute name="attr1">value2</attribute>
        </page>
        <page id="page3">
          <attribute name="attr1">value1</attribute>
        </page>
      <pages>
    </root>
    Kann mir dafür jemand eine Lösung nennen?

    Kann ich mit XML irgendwelche Links/Includes erzeugen welche die Seiten im Tag <book> durch die richtigen Seiten ersetzen, bzw. referenzieren?

    Viele Grüße

  • #2
    Mit der XML-Eingabe
    Code:
    <root>
      <books>
        <book id="book1">
          <page ref="page1" />
          <page ref="page2" />
          <page ref="page3" />
          <page ref="page2" />
        </book>
        <book id="book2">
          <page ref="page3" />
          <page ref="page2" />
        </book>
      </books>
      <pages>
        <page id="page1">
          <attribute name="attr1">value1</attribute>
        </page>
        <page id="page2">
          <attribute name="attr1">value2</attribute>
        </page>
        <page id="page3">
          <attribute name="attr1">value1</attribute>
        </page>
      </pages>
    </root>
    gibt das Stylesheet
    Code:
    <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="1.0">
      
      <xsl:param name="book-id" select="'book1'"/>
      <xsl:param name="att-name" select="'attr1'"/>
      <xsl:param name="value" select="'value1'"/>
      
      <xsl:output method="text"/>
      
      <xsl:key name="k1" match="books/book" use="@id"/>
      <xsl:key name="k2" match="pages/page" use="@id"/>
      
      <xsl:template match="/">
        <xsl:value-of select="count(key('k2', key('k1', $book-id)/page/@ref)[attribute[@name = $att-name] = $value])"/>
      </xsl:template>
    
    </xsl:stylesheet>
    die Ausgabe "2".
    Wenn du die Referenzen ersetzen willst, kann man dafür natürlich auch key verwenden, nur dass man statt count dann eher ein
    Code:
    <xsl:template match="book">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:copy-of select="key('k2', page/@ref)"/>
      </xsl:copy>
    </xsl:template>
    verwendet.

    Comment


    • #3
      Mit XSLT 2.0 (implementiert durch Saxon 9 http://saxon.sourceforge.net/ oder AltovaXML Tools http://www.altova.com/altovaxml.html) kann man das auch noch kompakter erledigen, da man da Parameter/Variablen bei der key-Definition benutzen kann:
      Code:
      <xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="2.0">
        
        <xsl:param name="book-id" select="'book1'"/>
        <xsl:param name="att-name" select="'attr1'"/>
        <xsl:param name="value" select="'value1'"/>
        
        <xsl:output method="text"/>
        
        <xsl:key name="k1" match="books/book" use="@id"/>
        <xsl:key name="k2" match="pages/page[attribute[@name = $att-name] = $value]" use="@id"/>
        
        <xsl:template match="/">
          <xsl:value-of select="count(key('k2', key('k1', $book-id)/page/@ref))"/>
        </xsl:template>
      
      </xsl:stylesheet>

      Comment


      • #4
        Danke

        Vielen vielen Dank. Funktioniert wunderbar

        Comment

        Working...
        X