XSL - suchen, aufsummieren, ausgeben von gleichen Inhalten/Werten?

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

  • XSL - suchen, aufsummieren, ausgeben von gleichen Inhalten/Werten?

    Hallo liebes Forum,

    erst einmal herzlich Willkommen von meiner Seite aus.

    Ich habe folgendes Problem:

    erstmal einen Auszug aus der XML Datei:

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <topo>
    3. <node>
    4. <id>2148063978</id>
    5. <name>Hans</name>
    6. <systemObjectId>10</systemObjectId>
    7. </node>
    8. <node>
    9. <id>2148063988</id>
    10. <name>Paul</name>
    11. <systemObjectId>10</systemObjectId>
    12. </node>
    13. <node>
    14. <id>2148063968</id>
    15. <name>Peter</name>
    16. <systemObjectId>11</systemObjectId>
    17. </node>
    18. <node>
    19. <id>2148063958</id>
    20. <name>Franz</name>
    21. <systemObjectId>11</systemObjectId>
    22. </node>
    23. <node>
    24. <id>2148063948</id>
    25. <name>Willi</name>
    26. <systemObjectId>11</systemObjectId>
    27. </node>
    28. </node>
    29. <node>
    30. <id>2148063928</id>
    31. <name>Gustav</name>
    32. <systemObjectId>7</systemObjectId>
    33. </node>
    34. </topo>
    Alles anzeigen


    habe also eine n Anzahl von <node> Knoten.

    Mit Hilfe dieses XSL Stylesheets:

    HTML-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. <html>
    5. <body>
    6. <h2>Ausgabe:</h2>
    7. <table border="1">
    8. <tr bgcolor="#647563">
    9. <th>Zahl</th>
    10. <th>ID</th>
    11. <th>Name</th>
    12. <th>SysObjectID</th>
    13. </tr>
    14. <xsl:for-each select="topo/node">
    15. <xsl:sort select="systemObjectId"/>
    16. <tr>
    17. <td><xsl:value-of select="position()" disable-output-escaping="yes"/></td>
    18. <td><xsl:value-of select="id"/></td>
    19. <td><xsl:value-of select="name"/></td>
    20. <td><xsl:value-of select="systemObjectId"/></td>
    21. </tr>
    22. </xsl:for-each>
    23. </table>
    24. </body>
    25. </html>
    26. </xsl:template>
    27. </xsl:stylesheet>
    Alles anzeigen


    komme ich zu folgender Ausgabe im Browser:
    [Blockierte Grafik: http://img242.imageshack.us/img242/9480/bild1rb.jpg]

    Soweit so gut, alles schon einmal wie ich es gerne hätte. Nun soll die Ausgabe aber nochmal modifiziert wird, so dass das Endergebnis dann wie folgt ausschaut:

    [Blockierte Grafik: http://img153.imageshack.us/img153/7312/bild2y.jpg]

    Es sollen alle gleichen sysObjectID's (die ja schon sortiert sind) aufsummiert werden und wie auf dem Bild gezeigt ausgegeben werden.

    Ich habe mich natürlich schonmal schlau gemacht und bin auf folgenden Thread gestoßen: Wordcount

    Mit Hilfe des folgenden XSL Codes:

    HTML-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:output indent="yes" method="html"/>
    4. <xsl:key name="only" match="//systemObjectId" use="."/>
    5. <xsl:template match="/">
    6. <html>
    7. <table border="1">
    8. <tr bgcolor="#647563">
    9. <th>SysObjectID</th>
    10. <th>Anzahl</th>
    11. </tr>
    12. <xsl:apply-templates select="topo"/>
    13. </table>
    14. </html>
    15. </xsl:template>
    16. <xsl:template match="topo">
    17. <xsl:for-each select="child::*/systemObjectId[generate-id()= generate-id(key('only', .)[1])]">
    18. <tr>
    19. <td>
    20. <xsl:value-of select="."/>
    21. </td>
    22. <td>
    23. <xsl:value-of select="count(key('only',.))"/>
    24. </td>
    25. </tr>
    26. </xsl:for-each>
    27. </xsl:template>
    28. </xsl:stylesheet>
    Alles anzeigen


    komme ich auch zur richtigen Ausgabe wie der folgende Screenshot zeigt:

    [Blockierte Grafik: http://img709.imageshack.us/img709/7395/bild3vp.jpg]

    Doch egal wie ich versuche die beiden XSL Stylesheets miteinander zu kombinieren, ich bekomme es einfach nicht hin.
    Hat jmd. vllt noch ne Idee oder zumindest ein Vorschlag wie ich es weiter probieren könnte?

    Schon mal vielen Dank für eure Mühen!
  • HTML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    3. <xsl:output method="html" indent="yes"/>
    4. <xsl:key name="only" match="systemObjectId" use="."/>
    5. <xsl:template match="/">
    6. <html>
    7. <xsl:apply-templates select="topo"/>
    8. </html>
    9. </xsl:template>
    10. <xsl:template match="topo">
    11. <table border="3px solid">
    12. <xsl:for-each
    13. select="//node[generate-id(./systemObjectId)=generate-id(key('only', ./systemObjectId)[1])]">
    14. <xsl:variable name="ak" select="./systemObjectId"/>
    15. <xsl:for-each select="//node[systemObjectId=$ak]">
    16. <tr>
    17. <td>
    18. <xsl:value-of select="id"/>
    19. </td>
    20. <td>
    21. <xsl:value-of select="name"/>
    22. </td>
    23. <td>
    24. <xsl:value-of select="$ak"/>
    25. </td>
    26. </tr>
    27. </xsl:for-each>
    28. <tr>
    29. <td>Total</td>
    30. <td> =</td>
    31. <td>
    32. <xsl:value-of select="count(key('only',./systemObjectId))"/>
    33. </td>
    34. </tr>
    35. </xsl:for-each>
    36. </table>
    37. </xsl:template>
    38. </xsl:stylesheet>
    Alles anzeigen
    Helmut Hagemann
    Derjenige, der sagt: Das geht nicht, soll den nicht stören, der's gerade tut.