Struktur einer XML-Datei mithilfe von XSL verändern

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

  • Struktur einer XML-Datei mithilfe von XSL verändern

    Hallo,
    ich habe einen Datensatz bekommen, den ich gerne auswerten möchte. Jedoch ist die Datenstruktur dieser XML-Dateien nicht so, wie ich es mir vorstelle.
    Das Problem ist, dass die Ausgangsdateien eine "Ebene" zuviel haben. Die Felder, welche die Feldbeschreibungen enthalten sollen entfernt werden.

    Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!-- Filename="TEST.XML" -->
    3. <Export Count="1" Date="2009-05-14T18:00:00" Language="DE" Range="DE">
    4. <DataRecord>
    5. <Feldbeschreibung1>
    6. <Feld1>DATA</Feld1>
    7. <Feld2>DATA</Feld2>
    8. </Feldbeschreibung1>
    9. <Feldbeschreibung2>
    10. <Feld3>DATA</Feld3>
    11. <Feld4>DATA</Feld4>
    12. </Feldbeschreibung2>
    13. <Feldbeschreibung3>
    14. <Feld5>DATA</Feld5>
    15. <Feld6>DATA</Feld6>
    16. </Feldbeschreibung3>
    17. <Feldbeschreibung4>
    18. <Feld7>DATA</Feld7>
    19. <Feld8>DATA</Feld8>
    20. </Feldbeschreibung4>
    21. <Feldbeschreibung5>
    22. <Feld9>DATA</Feld9>
    23. <Feld10>DATA</Feld10>
    24. <Feld11>DATA</Feld11>
    25. <Feld12>DATA</Feld12>
    26. <Feld13>DATA</Feld13>
    27. <Feld14>DATA</Feld14>
    28. <Feld15>DATA</Feld15>
    29. </Feldbeschreibung5>
    30. <Feldbeschreibung6>
    31. <Feld16>DATA</Feld16>
    32. <Feld17>DATA</Feld17>
    33. </Feldbeschreibung6>
    34. <Feldbeschreibung7>
    35. <Feld18>DATA</Feld18>
    36. </Feldbeschreibung7>
    37. <Feldbeschreibung8>
    38. <Feld19>DATA</Feld19>
    39. <Feld20>DATA</Feld20>
    40. <Feld21>DATA</Feld21>
    41. <Feld22>DATA</Feld22>
    42. </Feldbeschreibung8>
    43. <Feldbeschreibung9>
    44. <Feld23>DATA</Feld23>
    45. </Feldbeschreibung9>
    46. </DataRecord>
    47. </Export>
    Alles anzeigen

    Dies ist ein Beispiel für die Struktur der Ausgangsdatei, wobei der Usprungsdatensatz eine sehr viel größere Menge solcher <DataRecords> umfasst.
    Ich kann mithilfe der folgenden XSL-Datei und Saxonica die Struktur ändern, jedoch gelingt es mir nur, wenn es lediglich einen <DataRecord> in der XML-Datei gibt.

    Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    3. <xsl:template match="/">
    4. <xsl:for-each select="//DataRecord">
    5. <DataRecord>
    6. <xsl:for-each select="//Feld1">
    7. <Feld1>
    8. <xsl:value-of select="."></xsl:value-of>
    9. </Feld1>
    10. </xsl:for-each>
    11. <xsl:for-each select="//Feld2">
    12. <Feld2>
    13. <xsl:value-of select="."></xsl:value-of>
    14. </Feld2>
    15. </xsl:for-each>
    16. <xsl:for-each select="//Feld3">
    17. <Feld3>
    18. <xsl:value-of select="."></xsl:value-of>
    19. </Feld3>
    20. </xsl:for-each>
    21. <xsl:for-each select="//Feld4">
    22. <Feld4>
    23. <xsl:value-of select="."></xsl:value-of>
    24. </Feld4>
    25. </xsl:for-each>
    26. <xsl:for-each select="//Feld5">
    27. <Feld5>
    28. <xsl:value-of select="."></xsl:value-of>
    29. </Feld5>
    30. </xsl:for-each>
    31. <xsl:for-each select="//Feld6">
    32. <Feld6>
    33. <xsl:value-of select="."></xsl:value-of>
    34. </Feld6>
    35. </xsl:for-each>
    36. <xsl:for-each select="//Feld7">
    37. <Feld7>
    38. <xsl:value-of select="."></xsl:value-of>
    39. </Feld7>
    40. </xsl:for-each>
    41. <xsl:for-each select="//Feld8">
    42. <Feld8>
    43. <xsl:value-of select="."></xsl:value-of>
    44. </Feld8>
    45. </xsl:for-each>
    46. <xsl:for-each select="//Feld9">
    47. <Feld9>
    48. <xsl:value-of select="."></xsl:value-of>
    49. </Feld9>
    50. </xsl:for-each>
    51. <xsl:for-each select="//Feld10">
    52. <Feld10>
    53. <xsl:value-of select="."></xsl:value-of>
    54. </Feld10>
    55. </xsl:for-each>
    56. <xsl:for-each select="//Feld11">
    57. <Feld11>
    58. <xsl:value-of select="."></xsl:value-of>
    59. </Feld11>
    60. </xsl:for-each>
    61. <xsl:for-each select="//Feld12">
    62. <Feld12>
    63. <xsl:value-of select="."></xsl:value-of>
    64. </Feld12>
    65. </xsl:for-each>
    66. <xsl:for-each select="//Feld13">
    67. <Feld13>
    68. <xsl:value-of select="."></xsl:value-of>
    69. </Feld13>
    70. </xsl:for-each>
    71. <xsl:for-each select="//Feld14">
    72. <Feld14>
    73. <xsl:value-of select="."></xsl:value-of>
    74. </Feld14>
    75. </xsl:for-each>
    76. <xsl:for-each select="//Feld15">
    77. <Feld15>
    78. <xsl:value-of select="."></xsl:value-of>
    79. </Feld15>
    80. </xsl:for-each>
    81. <xsl:for-each select="//Feld16">
    82. <Feld16>
    83. <xsl:value-of select="."></xsl:value-of>
    84. </Feld16>
    85. </xsl:for-each>
    86. <xsl:for-each select="//Feld17">
    87. <Feld17>
    88. <xsl:value-of select="."></xsl:value-of>
    89. </Feld17>
    90. </xsl:for-each>
    91. <xsl:for-each select="//Feld18">
    92. <Feld18>
    93. <xsl:value-of select="."></xsl:value-of>
    94. </Feld18>
    95. </xsl:for-each>
    96. <xsl:for-each select="//Feld19">
    97. <Feld19>
    98. <xsl:value-of select="."></xsl:value-of>
    99. </Feld19>
    100. </xsl:for-each>
    101. <xsl:for-each select="//Feld20">
    102. <Feld20>
    103. <xsl:value-of select="."></xsl:value-of>
    104. </Feld20>
    105. </xsl:for-each>
    106. <xsl:for-each select="//Feld21">
    107. <Feld21>
    108. <xsl:value-of select="."></xsl:value-of>
    109. </Feld21>
    110. </xsl:for-each>
    111. <xsl:for-each select="//Feld22">
    112. <Feld22>
    113. <xsl:value-of select="."></xsl:value-of>
    114. </Feld22>
    115. </xsl:for-each>
    116. <xsl:for-each select="//Feld23">
    117. <Feld23>
    118. <xsl:value-of select="."></xsl:value-of>
    119. </Feld23>
    120. </xsl:for-each>
    121. </DataRecord>
    122. </xsl:for-each>
    123. </xsl:template>
    124. </xsl:stylesheet>
    Alles anzeigen

    Im Beispielfall gelingt es mir mit dieser XSL-Datei aus der Ausgangs XML-Datei die folgende Datei zu generieren, welche die gewünschte Struktur besitzt.

    Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <DataRecord>
    3. <Feld1>DATA</Feld1>
    4. <Feld2>DATA</Feld2>
    5. <Feld3>DATA</Feld3>
    6. <Feld4>DATA</Feld4>
    7. <Feld5>DATA</Feld5>
    8. <Feld6>DATA</Feld6>
    9. <Feld7>DATA</Feld7>
    10. <Feld8>DATA</Feld8>
    11. <Feld9>DATA</Feld9>
    12. <Feld10>DATA</Feld10>
    13. <Feld11>DATA</Feld11>
    14. <Feld12>DATA</Feld12>
    15. <Feld13>DATA</Feld13>
    16. <Feld14>DATA</Feld14>
    17. <Feld15>DATA</Feld15>
    18. <Feld16>DATA</Feld16>
    19. <Feld16>DATA</Feld16>
    20. <Feld17>DATA</Feld17>
    21. <Feld18>DATA</Feld18>
    22. <Feld19>DATA</Feld19>
    23. <Feld20>DATA</Feld20>
    24. <Feld21>DATA</Feld21
    25. ><Feld22>DATA</Feld22>
    26. <Feld23>DATA</Feld23>
    27. </DataRecord>
    Alles anzeigen

    Ich hoffe es wird einigermaßen klar, welches Ziel ich mit der Vorgehensweise verfolge.
    Ich bin bei weitem kein Programmierer und habe mich für dieses Projekt zum ersten Mal mit XSL/XML wirklich auseinandergesetzt.
    Die Frage ist jetzt eigentlich gibt es eventuell eine einfachere Syntax, für die XSL-Datei, und wie bekomme ich es hin, dass es für eine beliebige Anzahl von <DataRecords> funktioniert?
    Vielen Dank für Antworten!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von hannes| ()

  • schlechte xml datei

    so wird xml nicht benutzt
    eine Nummierung ist Unsinn da sie erzeugt werden könnte

    aber ist möglich sie mit xsl aus zuwerten

    XML-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 indent="yes" method="xml"/>
    4. <xsl:template match="/">
    5. <xsl:apply-templates select="Export"/>
    6. </xsl:template>
    7. <xsl:template match="Export">
    8. <xsl:apply-templates select="DataRecord"/>
    9. </xsl:template>
    10. <xsl:template match="DataRecord">
    11. <DataRecord>
    12. <xsl:for-each select=".//*/*">
    13. <xsl:element name="{local-name(.)}">
    14. <xsl:value-of select="."/>
    15. </xsl:element>
    16. </xsl:for-each>
    17. </DataRecord>
    18. </xsl:template>
    19. </xsl:stylesheet>
    Alles anzeigen


    wenn zweiter DatenRecord geben ist die erzuegt Xml datei nicht valid
    bei fragen icq 567877710
    Helmut Hagemann
    Helmut Hagemann
    Derjenige, der sagt: Das geht nicht, soll den nicht stören, der's gerade tut.
  • Das mit den Zahlen habe ich händisch gemacht, da ich die eigentlichen Daten nicht veröffentlichen wollte. Ein weiterer Fehler von mir war, dass ich vergessen habe, dass es in der Output-XML-Datei einen schließenden Tag gibt, der alle <DataRecords> einschließt. Diesen habe ich in der XSL-Datei von dir noch eingebaut und bekomme so eine valide XML-Datei. Es funktioniert auch mit sehr großen XML-Dateien, die mehr als einen Datensatz enthalten.

    Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    3. <xsl:output indent="yes" method="xml"/>
    4. <xsl:template match="/">
    5. <xsl:apply-templates select="Export"/>
    6. </xsl:template>
    7. <xsl:template match="Export">
    8. <Export>
    9. <xsl:apply-templates select="DataRecord"/>
    10. </Export>
    11. </xsl:template>
    12. <xsl:template match="DataRecord">
    13. <DataRecord>
    14. <xsl:for-each select=".//*/*">
    15. <xsl:element name="{local-name(.)}">
    16. <xsl:value-of select="."/>
    17. </xsl:element>
    18. </xsl:for-each>
    19. </DataRecord>
    20. </xsl:template>
    21. </xsl:stylesheet>
    Alles anzeigen

    Vielen Dank für die Hilfe!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von hannes| ()