Am 07.02.2014 18:58, schrieb Bjoern Hoehrmann:
> * Stephan Hennig wrote in de.comp.text.xml:
>>ich möchte sämtliches XML-Markup aus einem Textdokument[1] entfernen.
>>Das klappt recht erfreulich mit XMLStarlet[2]
>>
>> $xml sel -t -m "/_:*" -v "." in.xml
>>
>>oder alternativ
>>
>> $xml sel --text -t -c "/_:*" in.xml
>>
>>Zwischen den Wörtern des XML-Dokuments kann sich ein Element <lb>
>>befinden (ähnlich <br /> in HTML), welches bei den oben gezeigten
>>Konvertierungen leider rückstandslos verschwindet, wodurch in der
>>Textausgabe Wortzwischenraum verloren gehen kann.
>
> Die Regeln für beides lassen sich einfach in XSLT beschreiben, und ich
> sehe, XMLStarlet kann auch XSLT. (Grob, text() immer ausgeben, Elemente
> immer rekursiv mit apply-templates verarbeiten, output method 'text',
> und dann nur ein template für 'lb' welches ' ' ausgibt).
Aha? Leider sind meine Kenntnisse in XML und insbesondere XSLT ziemlich
bescheiden. XMLStarlet kann mittels des Schalters -C jedoch das
verwendete XSLT anzeigen. Wegen des vorhandenen Namensraumes und da ich
nur den Text unterhalb /TEI/text erhalten möchte, unterscheiden sich die
tatsächlich verwendeten Kommandozeilen von den oben gezeigten etwas:
> $xml sel -C -N my=
http://www.tei-c.org/ns/1.0 -t -m "/my:TEI/my:text" -v "." in.xml
> <?xml version="1.0"?>
> <xsl:stylesheet xmlns:xsl="
http://www.w3.org/1999/XSL/Transform" xmlns:my="
http://www.tei-c.org/ns/1.0" xmlns:exslt="
http://exslt.org/common" version="1.0" extension-element-prefixes="exslt">
> <xsl:output omit-xml-declaration="yes" indent="no"/>
> <xsl:template match="/">
> <xsl:for-each select="/my:TEI/my:text">
> <xsl:call-template name="value-of-template">
> <xsl:with-param name="select" select="."/>
> </xsl:call-template>
> </xsl:for-each>
> </xsl:template>
> <xsl:template name="value-of-template">
> <xsl:param name="select"/>
> <xsl:value-of select="$select"/>
> <xsl:for-each select="exslt:node-set($select)[position()>1]">
> <xsl:value-of select="' '"/>
> <xsl:value-of select="."/>
> </xsl:for-each>
> </xsl:template>
> </xsl:stylesheet>
bzw.
> $xml sel -C --text -N my=
http://www.tei-c.org/ns/1.0 -t -c "/my:TEI/my:text" in.xml
> <?xml version="1.0"?>
> <xsl:stylesheet xmlns:xsl="
http://www.w3.org/1999/XSL/Transform" xmlns:my="
http://www.tei-c.org/ns/1.0" version="1.0">
> <xsl:output omit-xml-declaration="yes" indent="no" method="text"/>
> <xsl:template match="/">
> <xsl:copy-of select="/my:TEI/my:text"/>
> </xsl:template>
> </xsl:stylesheet>
Darin herumzufummeln, ist mir allerdings nicht möglich. Für einen
kleinen Patch wäre ich dankbar!
Viele Grüße,
Stephan Hennig