XSLT - Anzahl der Knoten zählen

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

  • XSLT - Anzahl der Knoten zählen

    Hallo Leute,

    als XML Newbie hänge ich in der Luft und weiß nicht mehr weiter.

    Ist:
    Ein XML Dokument das mittels eines XSLT Stylesheets in eine Datenbank importiert werden soll.
    Der Import der 1. Ebene funktioniert soweit (XSLT's mit festen Pfadangaben), aber nicht die verschachtelten Ebenen, da ich nicht weiß, wie ich mich durch die Verschachtelungen hangeln soll.
    Meine Idee: Anzahl der Objecte suchen, die im gleichnamigen Object als Child enthalten sind, um eine if/then/else Struktur programmieren zu können. Wenn größer 0 dann ist noch was da, wenn nicht dann beenden.

    ----- Dokument z.B. ----

    Quellcode

    1. <?xml version="1.0" encoding="UTF-16"?>
    2. <FMPReport link="DBreport.xml" type="Report" version="8" creationDate="19.06.2006"
    3. creationTime="23:03:17">
    4. <File name="testxyz" path="/Users/user/Desktop/">
    5. <CatalogDB>
    6. <xCategorie id="32769" name="xyz1">
    7. <Catalog2>
    8. <!-- Standard Baum -->
    9. <Object id="27" name="xID" dataType="Number" fieldType="Normal">
    10. <Serial increment="1" nextValue="2"/>
    11. <Storage index="None"/>
    12. </Object>
    13. <Object id="28" name="xName" dataType="Text" fieldType="Normal">
    14. <Serial/>
    15. <Storage index="None"/>
    16. </Object>
    17. <!-- verschachtelter Baum -->
    18. <Object id="29" name="xObjPos" dataType="Text" fieldType="Normal">
    19. <Serial/>
    20. <Storage index="None"/>
    21. <Object id="3111" name="xObjPos" dataType="Text" fieldType="Normal">
    22. <Serial/>
    23. <Storage index="None"/>
    24. <Object id="59876" name="xObjPos" dataType="Text" fieldType="Normal">
    25. <Serial/>
    26. <Storage index="None"/>
    27. </Object>
    28. <Object id="59877" name="xName" dataType="Text" fieldType="Normal">
    29. <Serial/>
    30. <Storage index="None"/>
    31. </Object>
    32. <Object id="59876" name="xName" dataType="Text" fieldType="Normal">
    33. <Serial/>
    34. <Storage index="None"/>
    35. <Object id="786534" name="nVerschachtelungen" dataType="Text" fieldType="Normal">
    36. <Serial/>
    37. <Storage index="None"/>
    38. </Object>
    39. </Object>
    40. </Object>
    41. </Object>
    42. </Catalog2>
    43. </xCategorie>
    44. </CatalogDB>
    45. </File>
    46. </FMPReport>
    Alles anzeigen

    Das Element "Object" kann in der verschachtelten Version "n" mal vorkommen. Hierzu wollte ich vorher mit einem XPath Befehl abfragen, ob überhaupt eine weitere Verschachtelung vorhanden ist.
    Ich arbeite mit festen Pfadangaben (kalkuliert durch die DB). Der Import funktioniert somit schon einwandfrei durch die verschachtelten Elemente. ABER ich will vorher prüfen, ob überhaupt ein Object noch vorhanden ist, um die Schleife zu beenden.
    Durch den kalkulierten Pfad kann ich den Import steuern, aber zur Abfrage, ob noch gleichnamige Elemente vorhanden sind, will ich nur eine Zahl (wieviel Objecte im Objekt als Child sind) erhalten.
    Wie kann denn eine Abfrage hierzu aussehen?
    Ergebnis sollte nur eine Zahl sein (5 enthaltene Childs mit dem Elementnamen "Object" im aktuellen "Object-Knoten").
    Kann mir jemand auf die Sprünge helfen?

    Vielen Dank

    Armin

    ----- XSLT Stylesheet für den Import ----

    Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    3. <xsl:template match="/*">
    4. <!-- xDynamicObjectPath -->
    5. <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
    6. <ERRORCODE>0</ERRORCODE>
    7. <PRODUCT BUILD="" NAME="" VERSION="0.3"/>
    8. <DATABASE DATEFORMAT="" LAYOUT="" NAME=""
    9. RECORDS="{count(/Report/File/CatalogDB/xCategorie/Catalog2/Object)}"
    10. TIMEFORMAT=""/>
    11. <METADATA>
    12. <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="DataType" TYPE="TEXT"/>
    13. <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="numOfObj" TYPE="NUMBER"/>
    14. </METADATA>
    15. <RESULTSET>
    16. <xsl:attribute name="FOUND"/>
    17. <xsl:for-each select="/Report/File/CatalogDB/xCategorie/Catalog2/Object">
    18. <ROW MODID="0" RECORDID="0">
    19. <COL>
    20. <DATA>
    21. <xsl:text>LytObject_Check</xsl:text>
    22. </DATA>
    23. </COL>
    24. <COL>
    25. <DATA>
    26. <xsl:value-of select="$VariableSonstwas"/>
    27. </DATA>
    28. </COL>
    29. </ROW>
    30. </xsl:for-each>
    31. </RESULTSET>
    32. </FMPXMLRESULT>
    33. </xsl:template>
    34. </xsl:stylesheet>
    Alles anzeigen