"&" im XML-Attribut (Umwandlung mit XSLT)

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

  • "&" im XML-Attribut (Umwandlung mit XSLT)

    Hallo!

    Ich habe ein kleines Problem. Und zwar habe ich mit XML und XSLT experimentiert.

    Ich habe in meiner Struktur unter anderem folgendes Schema (in der XML-Datei):

    Quellcode

    1. <link rel="http://www.google.de" disp="Google" bold="true" />


    Dieses forme ich mittels XSLT um in

    Quellcode

    1. <strong>
    2. <a href="http://www.google.de">Google</a>
    3. </strong>


    Problem:
    Sobald ich in einem XML-Attribut (in der XML-Datei) ein "&" verwende, wandeln meine Browser (Opera 9.01 und Firefox) die XML-Datei nicht mehr mittels dem XSTL um.

    z.B.

    Quellcode

    1. <link rel="http://..forum.php?thread=...&userid=..." disp="Forumthread xy" bold="false" />


    Ich brauche die Struktur für meine Startseite, auf der ich sämtliche Links gespeichert habe, darunter auch div. spezielle Forenthreads.

    Wie bekomme ich es hin, ein "&" ohne Probleme in den XML-Attributen zu benutzen?

    Hier ist ein Testarchiv, mit 2 Dateien, anhand denen das Problem nachvollzogen werden kann: test.zip
    Der 2. Link enthält ein "&" in der URL.
  • Für alle, die das Archiv nicht runterladen wollen:

    Inhalt der XML-Datei:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-16"?>
    2. <?xml-stylesheet type="text/xsl" href="index.xsl"?>
    3. <page>
    4. <startpage>
    5. <cell>
    6. <passage>
    7. <title>Kategorie XY</title>
    8. <link rel="http://www.google.de" disp="Google" />
    9. <link rel="http://www.studentenwerk-frankfurt.de/start.php?root=cb&uni=btu&subdir=essen&foot=yes" disp="Speiseplan" />
    10. </passage>
    11. </cell>
    12. </startpage>
    13. </page>
    Alles anzeigen


    Inhalt der XSLT-Datei:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-16"?>
    2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    3. <xsl:output doctype-public="-//W3C//DTD XHTML 1.0//EN" method="html"/>
    4. <xsl:template match="startpage">
    5. <xsl:element name="html" namespace="http://www.w3.org/1999/xhtml">
    6. <xsl:element name="head">
    7. <xsl:element name="title">Startseite</xsl:element>
    8. </xsl:element>
    9. <xsl:element name="body">
    10. <xsl:element name="table">
    11. <xsl:attribute name="class">startpage</xsl:attribute>
    12. <xsl:element name="tr">
    13. <xsl:apply-templates />
    14. </xsl:element>
    15. </xsl:element>
    16. </xsl:element>
    17. </xsl:element>
    18. </xsl:template>
    19. <xsl:template match="cell">
    20. <xsl:element name="td">
    21. <xsl:attribute name="class">cell</xsl:attribute>
    22. <xsl:apply-templates />
    23. </xsl:element>
    24. </xsl:template>
    25. <xsl:template match="passage">
    26. <xsl:element name="table">
    27. <xsl:attribute name="class">passage</xsl:attribute>
    28. <xsl:element name="tr">
    29. <xsl:element name="td">
    30. <xsl:apply-templates />
    31. <xsl:element name="br" />
    32. </xsl:element>
    33. </xsl:element>
    34. </xsl:element>
    35. </xsl:template>
    36. <xsl:template match="link">
    37. <xsl:element name="a">
    38. <xsl:attribute name="href"><xsl:value-of select="@rel" /></xsl:attribute>
    39. <xsl:attribute name="target">_blank</xsl:attribute>
    40. <!-- bold -->
    41. <xsl:choose>
    42. <xsl:when test="@bold='true'">
    43. <xsl:element name="strong">
    44. <xsl:value-of select="@disp" />
    45. </xsl:element>
    46. </xsl:when>
    47. <xsl:otherwise>
    48. <xsl:value-of select="@disp" />
    49. </xsl:otherwise>
    50. </xsl:choose>
    51. <!-- /bold -->
    52. </xsl:element>
    53. <xsl:element name="br" />
    54. <xsl:apply-templates />
    55. </xsl:template>
    56. <xsl:template match="headline">
    57. <xsl:element name="br" />
    58. <xsl:element name="span">
    59. <xsl:attribute name="class">headline</xsl:attribute>
    60. <xsl:apply-templates />
    61. </xsl:element>
    62. <xsl:element name="br" />
    63. </xsl:template>
    64. <xsl:template match="title">
    65. <xsl:element name="span">
    66. <xsl:attribute name="class">title</xsl:attribute>
    67. <xsl:apply-templates />
    68. </xsl:element>
    69. <xsl:element name="br" />
    70. </xsl:template>
    71. </xsl:stylesheet>
    Alles anzeigen
  • Folgende XML-Datei konnte mit Saxxon 8.7.3j problemlos mit deinem Stylesheet konvertiert werden:

    Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <?xml-stylesheet type="text/xsl" href="index.xsl"?>
    3. <page>
    4. <startpage>
    5. <cell>
    6. <passage>
    7. <title>Kategorie XY</title>
    8. <link rel="http://www.google.de" disp="Google" />
    9. <link rel="http://www.studentenwerk-frankfurt.de/start.php?root=cb&amp;uni=btu&amp;subdir=essen&amp;foot=yes" disp="Speiseplan" />
    10. </passage>
    11. </cell>
    12. </startpage>
    13. </page>
    Alles anzeigen


    Edit: Und mit Firefox 1.5.0.6 funzt es auch
  • Und das folgende XSLT ist etwas einfacher, und löst das Namespace-Problem:

    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. xmlns="http://www.w3.org/1999/xhtml">
    4. <xsl:output doctype-public="-//W3C//DTD XHTML 1.0//EN" method="html"/>
    5. <xsl:template match="startpage">
    6. <xsl:element name="html">
    7. <head>
    8. <title>Startseite</title>
    9. </head>
    10. <body>
    11. <table class="startpage">
    12. <tr>
    13. <xsl:apply-templates />
    14. </tr>
    15. </table>
    16. </body>
    17. </xsl:element>
    18. </xsl:template>
    19. <xsl:template match="cell">
    20. <td class="cell">
    21. <xsl:apply-templates />
    22. </td>
    23. </xsl:template>
    24. <xsl:template match="passage">
    25. <table class="passage">
    26. <tr>
    27. <td>
    28. <xsl:apply-templates />
    29. <br />
    30. </td>
    31. </tr>
    32. </table>
    33. </xsl:template>
    34. <xsl:template match="link">
    35. <xsl:element name="a">
    36. <xsl:attribute name="href"><xsl:value-of select="@rel" /></xsl:attribute>
    37. <xsl:attribute name="target">_blank</xsl:attribute>
    38. <!-- bold -->
    39. <xsl:choose>
    40. <xsl:when test="@bold='true'">
    41. <strong>
    42. <xsl:value-of select="@disp" />
    43. </strong>
    44. </xsl:when>
    45. <xsl:otherwise>
    46. <xsl:value-of select="@disp" />
    47. </xsl:otherwise>
    48. </xsl:choose>
    49. <!-- /bold -->
    50. </xsl:element>
    51. <br />
    52. <xsl:apply-templates />
    53. </xsl:template>
    54. <xsl:template match="headline">
    55. <br />
    56. <span class="headline">
    57. <xsl:apply-templates />
    58. </span>
    59. <br />
    60. </xsl:template>
    61. <xsl:template match="title">
    62. <span class="title">
    63. <xsl:apply-templates />
    64. </span>
    65. <br />
    66. </xsl:template>
    67. </xsl:stylesheet>
    Alles anzeigen