Zeilenumbruch in XML -> XSL -> HTML
Alexander Zeitler
- xsl
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"> <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')"/> EUR</td>
<td class="commprogress"><xsl:value-of select="Progress"/> </td>
<td class="commamnt"><xsl:value-of select="format-number(translate(CommInvoiceAmnt,',','.'),'#.##0,00','de')"/> 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
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
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
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
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
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, '
')" />
<xsl:variable name="restlichertext" select="substring-after($text, '
')" />
<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>

 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
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, '
')">
<xsl:value-of select="substring-before($eingabe, '
')"/>
<br/>
<xsl:call-template name="umbruch">
<xsl:with-param name="eingabe" select="substring-after($eingabe,'
')"/>
</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
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