Mathias: Zeilenumbruch in XML erkennen und durch <br /> ersetzen

Hallo,

ich habe folgendes Problem:

Ich erhalte als Vorgabe eine XML-Datei, die ein tag <content> enthält. Der Inhalt ist dort einfach "reingeschüttet" worden, d.h. es existiert kein tag, das Zeilenumbrüche angibt, so dass man mit einem template diese sauber ersetzen könnte. Das Ganze schaut ungefähr so aus:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="test.xsl" ?>
<root>
<content>
 Hallo <strong>Welt</strong>,
 das ist ein kleiner text vom <strong>Autor</strong>.

Hier geht es dann weiter ...
</content>
</root>

Den fett markierten Bereich kann ich durch die entsprechenden HTML-Tags ersetzen, jedoch habe ich keine Funktion oder Workaround gefunden, die mir in XSL die ungekennzeichneten Zeilenumbrüche durch '<br />'s ersetzt.

Habt Ihr vielleicht eine Idee?

mathias

  1. Hallo,

    nicht direkt XSL jetzt sondern mehr sowas da:

    http://de.selfhtml.org/css/eigenschaften/ausrichtung.htm#white_space

    <html><head><title>white-space</title>
    <style type="text/css">
    #editor      { white-space:pre; }
    #langezeile  { white-space:nowrap; }
    </style>
    </head><body>

    <p id="editor">
    Der Absatz, den Sie gerade lesen,
       wurde als predefiniert definiert.
          Zeilenumbrüche sollten dabei so interpretiert
               werden, wie sie im Editor eingegeben wurden.</p>

    <p id="langezeile">Der Absatz, den Sie gerade lesen, darf nicht
    umbrochen werden. Es sollte kein automatischer Zeilenumbruch erfolgen. Bei
    diesem l&auml;ngeren Text m&uuml;ssen Sie vermutlich quer scrollen, um alles zu lesen.</p>

    </body></html>

    weiß nicht, ob das in deinem Fall funktioniert. Mal ausprobieren!

    Gruß,
    Kerstin

    1. Hallo Kerstin,

      leider klappt das nicht, da die einzelnen Zeilen erheblich länger sind. Es müsste schon mit XSL sein.

      mathias

  2. Hallo,

    ich habe folgendes Problem:

    Ich erhalte als Vorgabe eine XML-Datei, die ein tag <content> enthält. Der Inhalt ist dort einfach "reingeschüttet" worden, d.h. es existiert kein tag, das Zeilenumbrüche angibt, so dass man mit einem template diese sauber ersetzen könnte.

    Habt Ihr vielleicht eine Idee?

    Hier im Archiv suchen ;-)

    <xsl:template match="content">
      <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="content/text()">
      <xsl:call-template name="cr2br">
       <xsl:with-param name="text" select="." />
      </xsl:call-template>
    </xsl:template>

    <xsl:template name="cr2br">
     <xsl:param name="text" />
     <xsl:variable name="textafterbreak" select="substring-after($text, '&#xA;')" />
     xsl:choose
      <xsl:when test="contains($text, '&#xA;')">
       <xsl:value-of select="substring-before($text, '&#xA;')" />
       <br />
       <xsl:call-template name="cr2br">
       <xsl:with-param name="text" select="$textafterbreak" />
       </xsl:call-template>
      </xsl:when>
      xsl:otherwise
       <xsl:value-of select="$text" />
      </xsl:otherwise>
     </xsl:choose>
    </xsl:template>

    Grüße
    Thomas

    1. Hallo,

      Habt Ihr vielleicht eine Idee?
      Hier im Archiv suchen ;-)

      Vorrausgesetzt es wird ein XSLT 2 fähiger Prozessor benutzt, wäre es vielleicht auch sinnig xsl:analyse-string zu benutzen, tatsächlich gibt es in der XSLT 2 Spezifikation ein Beispiel genau für diesen Anwendungsfall:
      http://www.w3.org/TR/xslt20/#regex-examples

      Tim

    2. Hallo Thomas,

      vielen Dank für den Tipp funktioniert super.

      mathias