XPATH: Maximale Anzahl von Kindelementen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • XPATH: Maximale Anzahl von Kindelementen

    Hallo,

    gegeben sei folgende XML-Datei:

    Quellcode

    1. <x>
    2. <a>
    3. <b />
    4. </a>
    5. <a>
    6. <b />
    7. <b />
    8. <b />
    9. </a>
    10. <a>
    11. <b />
    12. </a>
    13. </x>
    Alles anzeigen



    Ich würde gerne eine XPath Anfrage formulieren die ferstellen kann wieviele <b>'s maximal unter einem <a> hängen. (in diesem Beispiel wäre die Lösung der Anfrage 3).
    Kann mir jemand helfen? Irgendwie ist mir nicht klar wie das geht und

    Quellcode

    1. max(//b/position())


    will leider irgendwie nicht :-(



    Vielen Dank schonmal für die Hilfe,
    dominik
  • ja, leider gibts ja keine Variablen bei XSLT, sonst würde der code ungefähr so aussehen:

    Quellcode

    1. <?xml version="1.0" encoding="iso-8859-1"?>
    2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    3. <xsl:template match="/">
    4. <xsl:for-each select="x/a">
    5. <xsl:variable name="max" select="0" />
    6. <xsl:if test="count(b) &gt; $max">
    7. <xsl:variable name="max" select="count(b)" />
    8. </xsl:if>
    9. <xsl:if test="position()=last()">
    10. <xsl:value-of select="$max" />
    11. </xsl:if>
    12. </xsl:for-each>
    13. </xsl:template>
    14. </xsl:stylesheet>
    Alles anzeigen


    Willst du nur die Anzahl der b's in den a's ausgeben gehts so:

    Quellcode

    1. <xsl:template match="/">
    2. <html>
    3. <head>
    4. </head>
    5. <body>
    6. <xsl:for-each select="x/a">
    7. <xsl:value-of select='count(b)'/><br />
    8. </xsl:for-each>
    9. </body>
    10. </html>
    11. </xsl:template>
    12. </xsl:stylesheet>
    Alles anzeigen
  • "d0nUt" schrieb:

    Willst du nur die Anzahl der b's in den a's ausgeben gehts so:

    Quellcode

    1. <xsl:template match="/">
    2. <html>
    3. <head>
    4. </head>
    5. <body>
    6. <xsl:for-each select="x/a">
    7. <xsl:value-of select='count(b)'/><br />
    8. </xsl:for-each>
    9. </body>
    10. </html>
    11. </xsl:template>
    12. </xsl:stylesheet>
    Alles anzeigen


    Dank für die Antwort, aber das hilft mir leider nicht weiter, denn ich benötige den Maximalwert - die einzelnen Werte sind mir egal...
  • lösung gefunden...

    Manchmal hat man eben ein Brett vor dem Kopf...

    Also die Lösung ist ganz einfach. Man muss nur XSLT 2.0 verwenden (z.B. SAXON-B 8.8):

    Quellcode

    1. <?xml version="1.0" encoding="ISO-8859-1"?>
    2. <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    3. <xsl:output method="text" />
    4. <xsl:template match="/">
    5. <xsl:text>Max Number of b's: </xsl:text>
    6. <xsl:value-of select="max(//a/count(b))" />
    7. </xsl:template>
    8. </xsl:stylesheet>
    Alles anzeigen


    Schönen Tag noch,
    dominik