Announcement

Collapse
No announcement yet.

Problem mit Zeichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit Zeichen

    Hallo!
    Mein Problem ist folgendes: ich bekomme Daten aus einer Datenbank. Zeilenumbrüche werden im XML wie folgt dargestellt:
    Code:
    1. Zeile 
 2.Zeile
    Nach meiner Transformation ist der Zeilenumbruch jedoch weg. Die XML-Ausgabe sieht wie folgt aus:
    Code:
    1. Zeile 2.Zeile
    Was mache ich falsch? Ich muss die Zeilenumbrüche auf jeden Fall erhalten. Das ist für die Weiterverarbeitung der Daten wichtig. Am besten wäre es, wenn sie in ein Tag ungewandelt werden könnten z.B. <br/>. Geht das?

    Viele Dank schon mal im voraus.

  • #2
    Da die Zeilenumbrüche (auch unter Windows) üblicherweise zu &#xA; (\n) normalisiert werden, sollte unter XSLT/XPath 2.0 dieser Ansatz reichen:
    Code:
    <xsl:value-of select="fn:replace(.,'\n','&lt;br /&gt;')" disable-output-escaping="yes"/>

    Comment


    • #3
      DANKE! Funktioniert super!!!

      Comment


      • #4
        Jetzt habe ich das Problem, dass alle Sonderzeichen umgewandelt werden und meine Datei dann nicht mehr valide ist z.B. &amp; wird zu &.
        Kann man das irgendwie verhindern?

        Comment


        • #5
          Setze die Ausgabemethode auf "xml" bzw. "html" oder "xhtml" bei 2.0: <xslutput method="xml" ... />.

          Comment


          • #6
            Hab ich.

            Code:
            <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" ...>
            ...
            <xsl:value-of select="fn:replace(.,'\n','&lt;br /&gt;')" disable-output-escaping="yes"/>
            ...
            Macht aus z.B.
            1. Zeile: GmbH &amp; Co. KG &#x0D;&#x0A; 2.Zeile

            So etwas:
            1. Zeile: GmbH & Co. KG <br/> 2.Zeile

            Ich brauche aber:
            1. Zeile: GmbH &amp; Co. KG <br/> 2.Zeile

            Comment


            • #7
              Hier wirkt sich das disable-output-escaping="yes" auch auf die &-Zeichen aus. Probiere diese Alternative unter Verwendung einer xsl:character-map (neue Technik unter XSLT 2.0):
              Code:
              <?xml version="1.0" encoding="UTF-8"?>
              <!DOCTYPE xsl:stylesheet [
                <!ENTITY br "&#xE001;">
              ]>
              <xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:fn="http://www.w3.org/2005/xpath-functions"
                exclude-result-prefixes="fn xs">
              
                <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"
                  use-character-maps="break" />
              
                <xsl:character-map name="break">
                  <xsl:output-character character="&#xE001;" string="&lt;br /&gt;"/>
                </xsl:character-map>
              
                <xsl:template match="test">
                  <test>
                    <xsl:value-of select="fn:replace(.,'\r\n','&br;')"/>
                  </test>  
                </xsl:template>
              
              </xsl:stylesheet>
              Für dieses XML-Dokument funktioniert es unter Saxon 9.2 HE:
              Code:
              <?xml version="1.0" encoding="UTF-8"?>
              <test>1. Zeile: GmbH &amp; Co. KG &#x0D;&#x0A; 2.Zeile</test>
              mit diesem Ergebnis:
              Code:
              <?xml version="1.0" encoding="UTF-8"?>
              <test>1. Zeile: GmbH &amp; Co. KG <br /> 2.Zeile</test>
              Ich habe für die (vermutlichen) Windows-Zeilenumbrüche noch '\r\n' statt '\n' verwendet. Hinweis: &#xE001; stammt aus dem reservierten privaten Unicode-Bereich.

              Comment


              • #8
                DANKE! Funktioniert super.

                Comment


                • #9
                  Ich habe nochmal eine Frage dazu ...
                  Ich weiß nicht so recht, wie ich es am besten händle, wenn weitere Inlineelemente z.B. <em>, <strong> ... vorkommen könnten, die ich dann einfach mit ausgeben möchte.
                  Da geht ja dann <xsl:value-of> nicht, oder.
                  Ich habe es mit
                  Code:
                  <xsl:apply-templates select="fn:replace(.,'\r\n','&br;')"/>
                  versucht. Geht aber auch nicht.
                  Hat jemand eine Tipp für mich.

                  Comment


                  • #10
                    Im jeweiligen Kontext (erschließt sich nicht) xsl:apply-templates aufrufen und separate Templates für em- und strong-Elemente vorhalten.

                    Comment

                    Working...
                    X