Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

xslt: Zeilenumbruch im Text-Content

543 views
Skip to first unread message

Ole Streicher

unread,
Dec 7, 2009, 6:26:53 AM12/7/09
to
Hallo,

ich möchte gerne im Text-Content jeweils beim Zeilenumbruch ein Element
im Ausgang einfügen, d.h.

---------8<----------
<verbatim>
for i=1,100 do:
print i
</verbatim>
---------8<----------

soll etwas werden wie:

---------8<----------
<w:r><w:br/>
for i=1, 100 do:<w:br/>
print i<w:br>
</w:r>
---------8<----------

Geht das mit xslt (speziell xsltproc) und wenn ja: wie?

Viele Grüße

Ole

Martin Honnen

unread,
Dec 7, 2009, 8:02:32 AM12/7/09
to
Ole Streicher wrote:

Mit XSLT 2.0 (möglich mit Saxon 9 (http://saxon.sourceforge.net),
AltovaXML Tools (http://www.altova.com/), Gestalt
(http://gestalt.sourceforge.net):

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:w="http://example.com/2009/w"
exclude-result-prefixes="xsd"
version="2.0">

<xsl:template match="verbatim">
<w:r>
<xsl:analyze-string select="." regex="\n">
<xsl:matching-substring>
<w:br/>
<xsl:value-of select="."/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</w:r>
</xsl:template>

</xsl:stylesheet>


Mit XSLT 1.0 wirst du ein rekursives Template schreiben müssen, dass mit
contains, substring-before, substring-after jeden Zeilenumbruch findet
und dann die Ausgabe erzeugt und den Rest weiterverabeitet.

--

Martin Honnen
http://msmvps.com/blogs/martin_honnen/

Ole Streicher

unread,
Dec 7, 2009, 10:12:15 AM12/7/09
to
Hallo,

Martin Honnen <maho...@yahoo.de> writes:
> Ole Streicher wrote:
>> ich möchte gerne im Text-Content jeweils beim Zeilenumbruch ein Element
>> im Ausgang einfügen

> Mit XSLT 1.0 wirst du ein rekursives Template schreiben müssen,

Ginge nicht auch EXSLT? Ich habe mir mal str:split angeschaut, das
müsste eigentlich das Erwartete können. Leider bekomme ich das nicht
hin. So sieht mein Komplettbeispiel aus:
---------------------------8<--------------------------------------
<?xml version="1.0" encoding="utf-8"?>


<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str"
version="1.0">

<xsl:output method="xml"/>
<xsl:template match="/">
<verbatim>
<xsl:for-each select="str:split(., '\n')">
<xsl:value-of select="."/><line-break/>
</xsl:for-each>
</verbatim>
</xsl:template>
</xsl:stylesheet>
---------------------------8<--------------------------------------

Das macht aus
---------------------------8<--------------------------------------
<?xml version="1.0"?>
<a>
for i in 1, 100:
print i
</a>
---------------------------8<--------------------------------------

aber ein
---------------------------8<--------------------------------------
<?xml version="1.0"?>
<verbatim>
for i in 1, 100:
print i
<line-break/></verbatim>
---------------------------8<--------------------------------------

d.h. es hängt den Linebreak nur ans Ende, nicht nach jedem
Zeilenumbruch. Warum ist das so?

Viele Grüße

Ole

Martin Honnen

unread,
Dec 7, 2009, 10:30:42 AM12/7/09
to
Ole Streicher wrote:

> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:str="http://exslt.org/strings"
> extension-element-prefixes="str"
> version="1.0">
>
> <xsl:output method="xml"/>
> <xsl:template match="/">
> <verbatim>
> <xsl:for-each select="str:split(., '\n')">

Laut Doku http://www.exslt.org/str/functions/split/index.html müsste das
zweite Argument wohl
str:split(., '&#10;')
sein.

0 new messages