automatischer Zeilenumbruch
Chris
- xsl
0 Thomas J.S.
Hi!
Nach langem Suchen und Lesen in Forum und Selfhtml habe ich zwar Möglichkeiten gefunden, in XML vorhandene Zeilenumbrüche zu setzen und auszulassen, aber wie ich neue in den Output bringe, hab ich leider nicht gefunden.
Mein Ziel: Ein XML-Dokument zu einem Mail(<xsl:output method="text" media-type="text/plain" encoding="iso-8859-1"/>) transformieren, wobei der Text automatisch nach einer bestimmten Zeichenzahl umgebrochen werden soll.
Ist dies mit XSL möglich? Der jeweils einzufüllende und umzubrechende Text steht in einem einzelnen Tag, muss also sonst nichts zusammengefügt werden..
Gruss, Chris
Hallo,
aber wie ich neue in den Output bringe, hab ich leider nicht gefunden.
z.B.:
xsl:text
</xsl:text>
Mein Ziel: Ein XML-Dokument zu einem Mail(<xsl:output method="text" media-type="text/plain" encoding="iso-8859-1"/>) transformieren, wobei der Text automatisch nach einer bestimmten Zeichenzahl umgebrochen werden soll.
Ist dies mit XSL möglich? Der jeweils einzufüllende und umzubrechende Text steht in einem einzelnen Tag, muss also sonst nichts zusammengefügt werden..
Ja, das ist möglich:
Es wird ein zweifacher Recursion notwendig sein:
ich habe hier noch <br /> in den Templates, wenn du dort was anderes brauchst muss du sie entsprechend ersetzen.
Wenn du was nicht verstehst, frage bitte nach!
Grüße
Thomas
PS: "<text>" ist das Element in dem sich dein Text befindet.
<xsl:template match="text">
<xsl:call-template name="addbreak">
<xsl:with-param name="text" select="." />
</xsl:call-template>
</xsl:template>
<xsl:template name="addbreak">
<xsl:param name="text" />
<xsl:variable name="textbeforebreak" select="substring($text, 1, 72)" />
<xsl:variable name="textafterbreak" select="substring($text, 73)" />
xsl:choose
<xsl:when test="string-length($text) > 72">
<xsl:call-template name="break">
<xsl:with-param name="textmitumbruch" select="$textbeforebreak" />
</xsl:call-template>
<br />
<xsl:call-template name="addbreak">
<xsl:with-param name="text" select="$textafterbreak" />
</xsl:call-template>
</xsl:when>
xsl:otherwise
<xsl:call-template name="break">
<xsl:with-param name="textmitumbruch" select="$text" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="break">
<xsl:param name="textmitumbruch" />
<xsl:variable name="afterbreak" select="substring-after($textmitumbruch, '
')" />
xsl:choose
<xsl:when test="contains($textmitumbruch, '
')">
<xsl:value-of select="substring-before($textmitumbruch, '
')" />
<br />
<xsl:call-template name="break">
<xsl:with-param name="textmitumbruch" select="$afterbreak" />
</xsl:call-template>
</xsl:when>
xsl:otherwise
<xsl:value-of select="$textmitumbruch" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Erstmal danke! Das ist endlich ein Lichtblick.. ;-)
Noch kapier ich das zweite Template ("break") nicht ganz. Denn im Quelltext sollte kein Umbruch vorkommen.. Gehe ich recht in der Annahme, dass es dann überflüssig ist? Bzw. dass nur das value-of, aber dann von textbeforebreakgebraucht wird?
Ein ernsthafteres Problem sind die Wortgrenzen. Die sollten schon eingehalten werden. Das Template dürfte also keine Wörter auseinanderreissen.. Versuche gerade, den textafterbreak auf Zeichen zu Beginn zu testen und ev. direkt anschliessende Zeichen noch vor dem Break anzufügen.. Hoffe das klappt.. Hast du einen einfacheren Vorschlag?
Gruss, Chris
<xsl:template name="addbreak">
<xsl:param name="text" />
<xsl:variable name="textbeforebreak" select="substring($text, 1, 72)" />
<xsl:variable name="textafterbreak" select="substring($text, 73)" />
...
</xsl:template>
<xsl:template name="break">
<xsl:param name="textmitumbruch" />
<xsl:variable name="afterbreak" select="substring-after($textmitumbruch, '
')" />
xsl:choose
<xsl:when test="contains($textmitumbruch, '
')">
<xsl:value-of select="substring-before($textmitumbruch, '
')" />
<br />
<xsl:call-template name="break">
<xsl:with-param name="textmitumbruch" select="$afterbreak" />
</xsl:call-template>
</xsl:when>
xsl:otherwise
<xsl:value-of select="$textmitumbruch" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Hallo,
Noch kapier ich das zweite Template ("break") nicht ganz. Denn im Quelltext sollte kein Umbruch vorkommen..
"
Nach langem Suchen und Lesen in Forum und Selfhtml habe ich zwar Möglichkeiten gefunden, in XML vorhandene Zeilenumbrüche zu setzen und auszulassen, aber wie ich neue in den Output bringe, hab ich leider nicht gefunden.
"
Also ging ich davon aus, dass du auch in deinem Text in XML Zeilenumbrüche hast.
Gehe ich recht in der Annahme, dass es dann überflüssig ist? Bzw. dass nur das value-of, aber dann von textbeforebreakgebraucht wird?
Wenn keine Zeilenumbrüche in Text vorkommen, dann ja.
<xsl:template name="addbreak">
<xsl:param name="text" />
<xsl:variable name="textbeforebreak" select="substring($text, 1, 72)" />
<xsl:variable name="textafterbreak" select="substring($text, 73)" />
xsl:choose
<xsl:when test="string-length($text) > 72">
<xsl:value-of select="$textbeforebreak" />
<br />
<xsl:call-template name="addbreak">
<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>
Ein ernsthafteres Problem sind die Wortgrenzen. Die sollten schon eingehalten werden. Das Template dürfte also keine Wörter auseinanderreissen..
Ich dachte schon, dass das kommen wird, aber gesagt hast du es nicht.
»»Versuche gerade, den textafterbreak auf Zeichen zu Beginn zu testen und ev. direkt anschliessende Zeichen noch vor dem Break anzufügen.. Hoffe das klappt.. Hast du einen einfacheren Vorschlag?
Es gibt im Archiv ein Template von mir, der genau diese Funktion erfüllt: überprüft ob beim Trennen ein Wort betroffen ist (bzw. ein Zeichen das nicht ein Leerzeichen ist) und trennt erst beim nächsten Leerzeichen im Text.
Du kannst diesen Template nehmen und mit "addbreak" kombinieren.
Grüße
Thomas
Ich nochmals.. Habe nun das break mal gelassen, aber die Variablen in addbreak angepasst:
<xsl:variable name="cuttextbeforebreak" select="substring($text, 1, 72)" />
<xsl:variable name="cuttextafterbreak" select="substring($text, 73)" />
<xsl:variable name="beforespace" select="substring-before($cuttextafterbreak,' ')"/>
<xsl:variable name="afterspace" select="substring-after($cuttextafterbreak,' ')"/>
<xsl:variable name="textbeforebreak"><xsl:value-of select="$cuttextbeforebreak"/><xsl:value-of select="$beforespace"/></xsl:variable>
<xsl:variable name="textafterbreak"><xsl:value-of select="$cuttextafterbreak"/><xsl:value-of select="$afterspace"/></xsl:variable>
Doch nun meldet mein Log:
xmlStrncat: realloc of 41162889 byte failed
malloc of 20581521 bytte failed
...
und ich krieg nen Loop zu sehen..
Findet wer den Fehler??
Gruss, Chris
Hallo,
Ich nochmals.. Habe nun das break mal gelassen, aber die Variablen in addbreak angepasst:
Das an sich ist ok, aber es sagt über das Wesentliche leider nichts aus, nämlich wie und wann du die Variablen aufrufst. Allein die Varaible macht noch keine Endlosschliefe, erst wenn du sie Verwendest kann es dazukommen.
Du musst schon den ganzen Template posten.
Grüße
Thomas