XSLT -> Fehlende Elemente

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

  • XSLT -> Fehlende Elemente

    Hi,

    ich hab ein XML-Dokument der folgenden Form:

    Quellcode

    1. <root>
    2. <orgs>
    3. <org>
    4. <a>A1</a>
    5. <b>B1</b>
    6. <c>C1</c>
    7. </org>
    8. <org>
    9. <a>A2</a>
    10. <c>C2</c>
    11. </org>
    12. <org>
    13. <a>A3</a>
    14. <b>B3</b>
    15. <c>C3</c>
    16. </org>
    17. </orgs>
    18. </root>
    Alles anzeigen


    Diese möchte ich mit Hilfe von XSLT in CSV umwandeln, was mir auch gelingt. Mein Problem ist aber, dass es vorkommen kann, das ein Element in <org> fehlt, hier im zweiten Datensatz Elment <b>. Das sorgt natürlich dafür, dass das CSV nachher so aussieht:

    Quellcode

    1. A1,A2,A3
    2. B1,B3
    3. C1,C2,C3


    Ich hätte es aber gern in der folgenden Form:

    Quellcode

    1. A1,A2,A3
    2. B1,,B3
    3. C1,C2,C3


    damit die Felder nachher beim Import in die Datenbank in den richtigen Spalten Landen.

    Hat jemand eine Lösung dafür?

    Gruß,
    D.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von madfool ()

  • madfool schrieb:

    Hi,

    der Gedanke kam mir auch schon, aber damit kann man ja prüfen ob ein Tag o.ä. einen Bestimmten Wert hat, was aber wenn das Element garnicht vorhanden ist, wie soll dann das if-Statement aussehen?

    Hast du ein Beispiel?

    Gruß,
    D.


    Bin nicht so der XSLT-Gott, mag das im Grunde gar nicht ;)

    Aber wenn du dir mal das anguckst (usegroup.de/software/xmltutori…schrittene.html#xslchoose)

    Müsstest du innerhalb des test-Attribut die Bedingung angeben. Also ich versuch das jetzt mal an Hand deines Beispiels zu probieren, ob das jetzt klappt ist ne andere Frage. Aber ich denke, dass es tendenziell so gehen könnte :D

    Quellcode

    1. <xsl:choose>
    2. <xsl:when test="/orgs/org/a"><xsl:value-of select="/orgs/org/a"/></xsl:when>
    3. <xsl:otherwise>,</xsl:otherwise>
    4. </xsl:when>
    5. </xsl:choose>
  • Hallo
    festgelegt sind die Knoten
    root orgs org
    die unterknoten sind variable
    zum Testen

    Quellcode

    1. <?xml version="1.0"?>
    2. <root>
    3. <orgs>
    4. <org>
    5. <z>D4</z>
    6. <a>A1</a>
    7. <b>B1</b>
    8. <c>C1</c>
    9. <d>D1</d>
    10. <y>E4</y>
    11. </org>
    12. <org>
    13. <a>A2</a>
    14. <c>C2</c>
    15. </org>
    16. <org>
    17. <a>A3</a>
    18. <b>B3</b>
    19. <y>Ey</y>
    20. <c>C3</c>
    21. </org>
    22. <org>
    23. <a>A40</a>
    24. <b>B4</b>
    25. <c>C4</c>
    26. <z>D4</z>
    27. <x>Ex</x>
    28. <y>Ey</y>
    29. <w>dd</w>
    30. </org>
    31. </orgs>
    32. </root>
    Alles anzeigen


    Quellcode

    1. <?xml version="1.0"?>
    2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    3. <xsl:output method="text"/>
    4. <!-- Key definieren für Einzigartigkeit-->
    5. <xsl:key name="wieviel" match="//org/*" use="local-name()"/>
    6. <xsl:template match="/">
    7. <xsl:call-template name="go">
    8. <!-- Auswahle aller Knoten unter org -->
    9. <xsl:with-param name="all" select="//org/*"/>
    10. </xsl:call-template>
    11. </xsl:template>
    12. <xsl:template name="go">
    13. <xsl:param name="all"/>
    14. <xsl:text>&#xA;</xsl:text>
    15. <!-- mit generate-id einzigartig erzeugen mit google gefunden xslt unique node-->
    16. <xsl:for-each select="$all[generate-id()= generate-id(key('wieviel', local-name())[1])]">
    17. <!-- sortieren einleiten -->
    18. <xsl:sort select="local-name()" order="ascending" data-type="text"/>
    19. <xsl:call-template name="counter">
    20. <!-- Anzahl der org eritteln -->
    21. <xsl:with-param name="anzahl" select="count(//org)"/>
    22. <!-- Knotennamen übergeben -->
    23. <xsl:with-param name="kname" select="local-name()"/>
    24. </xsl:call-template>
    25. <xsl:text>&#xA;</xsl:text>
    26. </xsl:for-each>
    27. </xsl:template>
    28. <xsl:template name="counter">
    29. <xsl:param name="anzahl"/>
    30. <!-- erster Knoten ist auf 1 -->
    31. <xsl:param name="aktule" select="1"/>
    32. <xsl:param name="kname"/>
    33. <!-- Rekursion Abbruchbedingung -->
    34. <xsl:if test="$aktule &lt;= $anzahl">
    35. <!-- Predikate bestimmen die Richtigkeit der Auswahl -->
    36. <xsl:value-of select="//org[$aktule]/*[$kname=local-name()]"/>
    37. <xsl:text>;</xsl:text>
    38. <xsl:call-template name="counter">
    39. <!-- Rekursion starten aktule um 1 erhöhen -->
    40. <xsl:with-param name="anzahl" select="$anzahl"/>
    41. <xsl:with-param name="aktule" select="$aktule + 1"/>
    42. <xsl:with-param name="kname" select="$kname"/>
    43. </xsl:call-template>
    44. </xsl:if>
    45. </xsl:template>
    46. </xsl:stylesheet>
    Alles anzeigen


    Quellcode

    1. A1;A2;A3;A40;
    2. B1;;B3;B4;
    3. C1;C2;C3;C4;
    4. D1;;;;
    5. ;;;dd;
    6. ;;;Ex;
    7. E4;;Ey;Ey;
    8. D4;;;D4;

    hoffe damit ist die Lösung gefunden
    Helmut Hagemann
    Derjenige, der sagt: Das geht nicht, soll den nicht stören, der's gerade tut.