Rondra: zeilenumbruch erzwingen

Hallo!

suche schon seit längerem und finde einfach nichts was mir helfen könnte.

ich bekomme vom Webserver einen XML Datenstrom, der mit meinen XSLs zu HTML transformiert wird.
Nun habe ich eine Tabelle , in deren zelle ich einen Nodeinhalt einfüge. Das problem ist nur, dass bei zu langen , ungebrochenen Inhalten des nodes, die zelle nicht umbrechen kann und so breit wird, dass mein Layout zerfetzt wird.

beispielhafter Nodeinhalt:

<MEINTEXT>BAGFSGHN1927235762835281978GR935829358790279583sjfjeif 3w583795278o20jf09395j2395798782487925hsihhf8a7983982058093AEtt983529053536569sjdugkwh8437593853hw84t74h
</MEINTEXT>

Wie ihr unschwer erkennen könnt, kann es sein dass der nodeinhalt nirgends ein leerzeichen enthalten kann, sodass kein sinnvoller zeilenumbruch über HTML oder CSS bordmittel erfolgen kann.
Ich muss aber nach 100 zeichen einen Zeilenumbruch erzwingen.

also habe ich Javascript zuhilfe genommen. Das ging auch problemlos bis mir mal ein anführungszeichen in diesem Node übermittelt worden ist. Damit kam mein JavaScript nicht klar. Habe es mit
<xsl:value-of select="translate(text(),'&#34;','&#34;')"/>
um die anf.zeichen zu codieren. aber es wird dann gar nicht mehr angezeigt.

Ihr seht das ist alles etwas komplexer :-/

Meine Frage kurz zusammengefasst: kann ich mit XSL bordmitteln den leerzeichenlosen Text nach jedem 100. zeichen umbrechen?

Hat jemand einen Tipp?

Vielen Dank!!
Rondra

  1. Hi,

    Meine Frage kurz zusammengefasst: kann ich mit XSL bordmitteln den leerzeichenlosen Text nach jedem 100. zeichen umbrechen?

    Schreib ein Template, das sich selbst rekursiv aufruft:
    Es bekommt den Text als Parameter übergeben.
    Sind das weniger als 100 Zeichen (string-length), den String ausgeben und fertig.
    Sonst:
    Die ersten 100 Zeichen (substring) und einen Zeilenumbruch <br/> (oder ein Leerzeichen) ausgeben.
    Dann sich selbst wieder aufrufen, wobei als Parameter der restliche Text (substring) übergeben wird.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Danke Andreas, ich versuch das mal...

      :-D

  2. Hallo,

    . Habe es mit
    <xsl:value-of select="translate(text(),'&#34;','&#34;')"/>
    um die anf.zeichen zu codieren. aber es wird dann gar nicht mehr angezeigt.

    translate() ersetzt einzelen Zeichen, also bedeutet deine variante folgendes: ersetze im Text die Zeichen
    & durch \

    duch &

    3 durch #
    4 durch 3
    ; durch 4

    Das ';' im dritten Argument wird ignoriert, weil das Argument länger ist als das zweite Argument. So viel in aller Kürze.

    Ihr seht das ist alles etwas komplexer :-/

    Nicht allzu sehr.

    Meine Frage kurz zusammengefasst: kann ich mit XSL bordmitteln den leerzeichenlosen Text nach jedem 100. zeichen umbrechen?

    Hat jemand einen Tipp?

    <xsl:template name="makebreak">
     <xsl:param name="text" />
     <xsl:variable name="textafterbreak" select="substring($text, 101)" />
     xsl:choose
      <xsl:when test="string-length($text) &gt; 100">
       <xsl:value-of select="substring($text, 1, 100)" />
       <br />
       <xsl:call-template name="makebreak">
        <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>

    <xsl:template match="MEINTEXT">
     <xsl:call-template name="makebreak">
      <xsl:with-param name="text" select="." />
     </xsl:call-template>
    </xsl:template>

    Grüße
    Thomas

    1. ohh, danke auch Dir Thomas!! Was für eine grosse Hilfe!! :))

    2. Hi,

      <xsl:value-of select="translate(text(),'&#34;','&#34;')"/>

      translate() ersetzt einzelen Zeichen, also bedeutet deine variante folgendes: ersetze im Text die Zeichen
      & durch \

      duch &

      3 durch #
      4 durch 3
      ; durch 4
      Das ';' im dritten Argument wird ignoriert, weil das Argument länger ist als das zweite Argument. So viel in aller Kürze.

      Wirklich?
      Müßte es nicht " durch \ ersetzen und das " im dritten Parameter ignorieren?

      Die Zeichenreferenz &#34; sollte doch bereits durch den XML-Parser ersetzt werden, der das XSL einliest.

      <xsl:template name="makebreak">

      [...]

      </xsl:template>

      Diese Übung wollte ich eigentlich Rondra überlassen ...

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hallo,

        <xsl:value-of select="translate(text(),'&#34;','&#34;')"/>

        translate() ersetzt einzelen Zeichen, also bedeutet deine variante folgendes: ersetze im Text die Zeichen
        & durch \

        duch &

        3 durch #
        4 durch 3
        ; durch 4
        Das ';' im dritten Argument wird ignoriert, weil das Argument länger ist als das zweite Argument. So viel in aller Kürze.

        Wirklich?

        Nein. Natürlich nicht! Du hast recht.
        (Ich _hasse_ es wenn ich Blödsinn erzähle!)

        Müßte es nicht " durch \ ersetzen und das " im dritten Parameter ignorieren?

        Genau das passiert.

        <xsl:template name="makebreak">
        [...]
        </xsl:template>

        Diese Übung wollte ich eigentlich Rondra überlassen ...

        Ich hatte das gerade zu Hand.

        Grüße
        Thomas

        1. Hi,

          Nein. Natürlich nicht! Du hast recht.
          (Ich _hasse_ es wenn ich Blödsinn erzähle!)

          ;-) Ich hasse es auch.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.