Elemente in Attribute umwandeln

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

  • Elemente in Attribute umwandeln

    Hallo zusammen!

    Ich möchte in einer XMl-Datei bestimmte Elemente in Attribute umwandeln. In einem Buch habe ich ein Stylesheet gefunden, dass mir dann aber ALLE Elemente in Attribute umwandelt. Es soll aber nur bei EINEM gemacht werden, z. B. bei "age". Irgendwie wills bei mir nicht "klick" machen... :(

    Folgendes XML-Dokument sei gegeben:

    Quellcode

    1. <?xml version="1.0" encoding="ISO-8859-1"?>
    2. <?xml-stylesheet type="text/xsl" href="zurueck.xsl"?>
    3. <people>
    4. <person>
    5. <firstname>Sal</firstname>
    6. <lastname>Mangano</lastname>
    7. <age>38</age>
    8. <height>5.75</height>
    9. </person>
    10. <person>
    11. <firstname>Mike</firstname>
    12. <lastname>Palmieri</lastname>
    13. <age>27</age>
    14. <height>5.10</height>
    15. </person>
    16. <person>
    17. <firstname>Vito</firstname>
    18. <lastname>Palmieri</lastname>
    19. <age>34</age>
    20. <height>6.00</height>
    21. </person>
    22. <person>
    23. <firstname>Vinny</firstname>
    24. <lastname>Mari</lastname>
    25. <age>37</age>
    26. <height>5.8</height>
    27. </person>
    28. </people>
    Alles anzeigen



    Das Stylesheet "zurueck.xsl" sieht so aus:

    Quellcode

    1. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    2. <xsl:import href="copy.xslt"/>
    3. <xsl:output method="xml" version="1.0" encoding="ISO-8859-1"/>
    4. <xsl:template match="person">
    5. <xsl:copy>
    6. <xsl:for-each select="*">
    7. <xsl:attribute name="{local-name(.)}">
    8. <xsl:value-of select="."/>
    9. </xsl:attribute>
    10. </xsl:for-each>
    11. </xsl:copy>
    12. </xsl:template>
    13. </xsl:stylesheet>
    Alles anzeigen



    Dieses importiert noch die folgende XSLT-Datei (copy.xslt):

    Quellcode

    1. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    2. <xsl:template match="node() | @*">
    3. <xsl:copy>
    4. <xsl:apply-templates select="@* | node()"/>
    5. </xsl:copy>
    6. </xsl:template>
    7. </xsl:stylesheet>



    Als Ergebnis bekomme ich bis jetzt folgendes XML-Dokument:

    Quellcode

    1. <?xml version="1.0" encoding="ISO-8859-1"?>
    2. <?xml-stylesheet type="text/xsl" href="zurueck.xsl"?>
    3. <people>
    4. <person firstname="Sal" lastname="Mangano" age="38" height="5.75"/>
    5. <person firstname="Mike" lastname="Palmieri" age="27" height="5.10"/>
    6. <person firstname="Vito" lastname="Palmieri" age="34" height="6.00"/>
    7. <person firstname="Vinny" lastname="Mari" age="37" height="5.8"/>
    8. </people>


    Also alle Elemente werden in Attribute umgewandelt. Wie schaffe ich es aber, dass nur die Elemente von "age" in Attribute umgewandelt werden? Habe schon an der xsl-Datei (zurueck.xsl) rumgespielt, komme aber nicht weiter... ;(

    Vielleicht hat ja einer von Euch die zündende Idee....

    Danke & Grüße
    gonzo

    p.s.: Das sind meine Dateien: Element als Attribut.zip
  • dr. gonzo schrieb:

    dass nur die Elemente von "age" in Attribute umgewandelt werden

    um genau zu sein meinst du das Element age. Es gibt keine Unterelemente.

    Du willst also nicht alle (*) Element in Attribute machen... sondern nur age

    Quellcode

    1. <xsl:for-each select="*">


    also setzt du einfach age ein. Für den Rest kopierst du die Elemente.
    Das kannst du auch mit when und otherwise machen.
  • Hallo d0nut!

    Danke für deine Antwort und sorry, dass ich mich etwas ungenau bzw. eher "schlecht" ausgedrückt habe. :thumbdown:

    Das mit <xsl:for-each select="*"> also <xsl:for-each select="age"> ist mir dann auch aufgefallen und funktioniert soweit.

    Eigentlich wollte ich, und das hätte ich vielleicht schon in meinem anderen Beitrag erwähnen können/müssen, dass der Wert von "age" ein Attribut vom Element "age" wird. (Stimmt die Formulierung so?) ?(

    Die (Wunsch-)XML-Datei soll eigentlich so aussehen:

    Quellcode

    1. <people>
    2. <person>
    3. <firstname>Sal</firstname>
    4. <lastname>Mangano</lastname>
    5. <age def="38" />
    6. <height>5.75</height>
    7. </person>
    8. <person>
    9. <firstname>Mike</firstname>
    10. <lastname>Palmieri</lastname>
    11. <age def="27" />
    12. <height>5.10</height>
    13. </person>
    14. <person>
    15. <firstname>Vito</firstname>
    16. <lastname>Palmieri</lastname>
    17. <age def="34" />
    18. <height>6.00</height>
    19. </person>
    20. <person>
    21. <firstname>Vinny</firstname>
    22. <lastname>Mari</lastname>
    23. <age def="37" />
    24. <height>5.8</height>
    25. </person>
    26. </people>
    Alles anzeigen


    Geht das irgendwie, oder ist da der vorherige Ansatz aus der "zurueck.xsl" völlig daneben?
  • Quellcode

    1. <?xml version="1.0"?>
    2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    3. <xsl:template match="/">
    4. <xsl:element name="personen">
    5. <xsl:apply-templates select="people/person"/>
    6. </xsl:element>
    7. </xsl:template>
    8. <xsl:template match="person">
    9. <xsl:element name="person">
    10. <xsl:apply-templates select="age"/>
    11. <xsl:apply-templates select="height"/>
    12. <xsl:apply-templates select="firstname"/>
    13. <xsl:apply-templates select="lastname"/>
    14. </xsl:element>
    15. </xsl:template>
    16. <xsl:template match="age">
    17. <xsl:attribute name="age">
    18. <xsl:value-of select="."/>
    19. </xsl:attribute>
    20. </xsl:template>
    21. <xsl:template match="firstname">
    22. <xsl:element name="firstname">
    23. <xsl:value-of select="."/>
    24. </xsl:element>
    25. </xsl:template>
    26. <xsl:template match="lastname">
    27. <xsl:element name="lastname">
    28. <xsl:value-of select="."/>
    29. </xsl:element>
    30. </xsl:template>
    31. <xsl:template match="height">
    32. <xsl:attribute name="height">
    33. <xsl:value-of select="."/>
    34. </xsl:attribute>
    35. </xsl:template>
    36. </xsl:stylesheet>
    Alles anzeigen