Alexander Zeitler: Zeilenumbruch in XML -> XSL -> HTML

Hallo,

ich habe folgendes Problem:

mit diesem XSL-File möchte ich das untenstehende XML-File parsen.
in "Description" befindet sich ein mehrzeiliger Text, der auch Zeilenumbrüche beinhaltet. Diese sind im XML-File vorhanden, werden jedoch vom XSL-File nicht interpretiert, d.h. der Text in "Description" erscheint ohne Zeilenumbrüche.

<xsl:for-each select="analysis/Commission">
<tr>
<td class="commnum"><xsl:value-of select="Number"/></td>
<td class="commcust">&#160;<xsl:value-of select="Customer"/></td>
<td class="commdesc"><xsl:value-of select="Description"/></td>
<td class="commamnt"><xsl:value-of select="format-number(translate(CommissionAmount,',','.'),'#.##0,00','de')"/>&#160;EUR</td>
<td class="commprogress"><xsl:value-of select="Progress"/>&#160;</td>
<td class="commamnt"><xsl:value-of select="format-number(translate(CommInvoiceAmnt,',','.'),'#.##0,00','de')"/>&#160;EUR</td>
</tr>
</xsl:for-each>

das XML-File:
<analysis>
<Commission>
<Number>221222</Number>
<CommissionDate>13.12.2002</CommissionDate>
<Progress>0</Progress>
<Customer>Müller GmbH</Customer>
<CustomerAdress>Firma</CustomerAdress>
<CustomerName>Müller GmbH</CustomerName>
<CustomerBranch />
<CustomerStreet>Hubertusweg 3</CustomerStreet>
<CustomerCountry>D</CustomerCountry>
<CustomerPostCode>12345</CustomerPostCode>
<CustomerCity>Musterstadt</CustomerCity>
<CustomerPhone>0815/4711</CustomerPhone>
<CustomerFAX>0815/1147</CustomerFAX>
<CustomerEMail />
<Description>Das
ist
die
Zeile
mit
den
Zeilenumbrüchen</Description>
<DeliveredCompletely>0</DeliveredCompletely>
<CommissionAmount>7800</CommissionAmount>
</Commission>
</analysis>

Ich habe hier im Archiv einige Beispiele/Fragen gefunden, die in diese Richtung zielen, aber zu einer Lösung bin ich damit leider trotz intensiver Versuche nicht gekommen.

Hat jemand vielleicht eine Lösung für o.g. Fall?

Gruss

Alex

  1. Hi,

    mit diesem XSL-File möchte ich das untenstehende XML-File parsen.
    in "Description" befindet sich ein mehrzeiliger Text, der auch Zeilenumbrüche beinhaltet. Diese sind im XML-File vorhanden, werden jedoch vom XSL-File nicht interpretiert, d.h. der Text in "Description" erscheint ohne Zeilenumbrüche.

    forsche in Richtung preserve-space

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    1. Hallo,

      forsche in Richtung preserve-space

      Damit hätte er nur sowas:
       <td class="commdesc">Das
          ist
          die
          Zeile
          mit
          den
          Zeilenumbrüchen
       </td>

      Grüße
      Thomas

  2. Hallo,

    <td class="commdesc"><xsl:apply-templates select="Description"/></td>

    -------------
     <xsl:template match="Description">
          <xsl:call-template name="umbruch" />
    </xsl:template>

    <xsl:template name="umbruch">
     <xsl:param name="text" select="." />
     <xsl:variable name="normalisiertertext" select="concat(normalize-space($text), ' ')" />
     <xsl:variable name="ersteswort" select="substring-before($normalisiertertext, ' ')" />
     <xsl:variable name="restlichertext" select="substring-after($normalisiertertext, ' ')" />
     <xsl:value-of select="$ersteswort" />
     <xsl:if test="$restlichertext">
      <br />
      <xsl:call-template name="umbruch">
       <xsl:with-param name="text" select="$restlichertext" />
      </xsl:call-template>
     </xsl:if>
    </xsl:template>
    --------------

    Grüße
    Thomas

    1. Hallo,

      Hallo,

      <td class="commdesc"><xsl:apply-templates select="Description"/></td>


      <xsl:template match="Description">
            <xsl:call-template name="umbruch" />
      </xsl:template>

      danke Dir für Deine Bemühungen. Allerdings wird jetzt nach jedem Leerzeichen getrennt. Kannst Du mir da evtl. noch mal weiterhelfen?

      Vielleicht auch mit einer kurzen Erklärung - damit ich es verstehe und nicht so oft damit "nerven" muß.

      Gruss

      Alex

      1. Hallo,

        danke Dir für Deine Bemühungen. Allerdings wird jetzt nach jedem Leerzeichen getrennt. Kannst Du mir da evtl. noch mal weiterhelfen?

        <xsl:template name="umbruch">
         <xsl:param name="text" select="." />
         <xsl:variable name="ersteswort" select="substring-before($text, '&#xA;')" />
         <xsl:variable name="restlichertext" select="substring-after($text, '&#xA;')" />
         <xsl:value-of select="$ersteswort" />
         <xsl:if test="$restlichertext">
          <br />
          <xsl:call-template name="umbruch">
           <xsl:with-param name="text" select="$restlichertext" />
          </xsl:call-template>
         </xsl:if>
        </xsl:template>
        </xsl:stylesheet>

        &#xA; ist das Wagenrücklaufzeichen (line feed)

        Ich habe deshalb versucht so sprechende Namen für die Variablen und Paramter zu geben, damit es leicht nachvollgezogen werden kann was da passiert. Solltest du etwas nciht verstehen, frage bitte ruhig konkret nach.

        Wenn das auch noch nicht passt fällt mir nur noch eine Lösung ein:
        <xsl:template match="Description">
         <pre><xsl:value-of select="." /></pre>
        </xsl:template>

        Grüße
        Thomas

        1. Ich habe deshalb versucht so sprechende Namen für die Variablen und Paramter zu geben, damit es leicht nachvollgezogen werden kann was da passiert. Solltest du etwas nciht verstehen, frage bitte ruhig konkret nach.

          ich hatte heute schon einmal eine ähnliche Lösung gefunden, die ich jedoch nicht anzuwenden wußte. Sie war Deiner sehr ähnlich.

          Ich habe sie jetzt noch etwas angepasst und siehe da: es funktioniert.

          Hier der Code:

          <xsl:template match="Description">
                <xsl:call-template name="umbruch" />
          </xsl:template>

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

          Danke nochmal für Deine Hilfe.

          Gruss

          Alex

          1. Hallo,

            ich hatte heute schon einmal eine ähnliche Lösung gefunden, die ich jedoch nicht anzuwenden wußte. Sie war Deiner sehr ähnlich.

            Ich habe sie jetzt noch etwas angepasst und siehe da: es funktioniert.

            Ja, das bringt im Ergebnis das selbe.
            Der Unterschied liegt in der "Art". Ich spare mir in meinem Template eine doppelte Abfrage: also ich überprüfe nicht erst ob der Text einen Umbuch beinhaltet, sondern selektiere einfach den Text vor dem Umbuch und falls es keinen gibt wird eben automatisch der gesamter Text ausgewählt. In Fällen wie hier ist außerdem eine <if>-Abfrage etwas performanter, da die <if>Abfrage den Template erst dann wieder aufruft, wenn es einen Text nach dem Umbruch gibt, bei der <when> Variante wird der Templte auf alle Fälle aufgerufen, auch wenn dann letztlich es keinen Text mehr zum formtieren gibt.

            Grüße
            Thomas