Subject: Re: [xsl] mixed content grouping by whitespace From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx> Date: Sun, 11 Apr 2010 20:19:54 -0400 |
On 11.04.2010 19:43, David Carlisle wrote: > On 11/04/2010 17:37, James Cummings wrote: > group-starting-with="text()"> > > > probably that wants to be text()[not(normalize-space(.))] > > David
Couldn't get the desired result like that.
I applied a two-step process:
1. Mark up whitespace using intermediate <seg @type="sep"> </seg>;
2. group adjacent WS (and non-WS) nodes, put the non-WS groups in a newly created w element.
T:\ftemp>type cummings.xml <ab xmlns="http://www.tei-c.org/ns/1.0"> <seg>foo blort wibble</seg><lb/> <seg>foo-<m>blort</m> wibble</seg><lb/> <seg><w>foo</w>-<m>blort</m> wibble</seg><lb/> </ab>
T:\ftemp>xslt2 cummings.xml cummings.xsl <?xml version="1.0" encoding="UTF-8"?><ab xmlns="http://www.tei-c.org/ns/1.0"> <seg><w>foo</w> <w>blort</w> <w>wibble</w></seg><lb/> <seg><w>foo-<m>blort</m></w> <w>wibble</w></seg><lb/> <seg><w><w>foo</w>-<m>blort</m></w> <w>wibble</w></seg><lb/> </ab> T:\ftemp>type cummings.xsl <?xml version="1.0" encoding="US-ASCII"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:t="http://www.tei-c.org/ns/1.0" xmlns:my="urn:X-temp" xmlns="http://www.tei-c.org/ns/1.0" exclude-result-prefixes="t my" version="2.0">
<xsl:template match="t:seg"> <xsl:copy> <xsl:copy-of select="@*"/> <!--break up the text nodes in order to be grouped--> <xsl:variable name="content" as="node()*"> <xsl:apply-templates mode="translate"/> </xsl:variable> <!--now group the content--> <xsl:for-each-group select="$content" group-starting-with="my:text"> <xsl:copy-of select="self::my:text/node()"/> <w> <xsl:copy-of select="current-group()[not(self::my:text)]"/> </w> </xsl:for-each-group> </xsl:copy> </xsl:template>
<xsl:template match="text()" mode="translate" priority="1"> <xsl:analyze-string select="." regex="\s+"> <xsl:matching-substring> <!--encapsulate the white-space so it can be detected and recreated--> <my:text><xsl:value-of select="."/></my:text> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:template>
<!--identity template; relies on built-in template rules for text--> <xsl:template match="@*|node()" mode="#default translate"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template>
-- XSLT/XQuery training: San Carlos, California 2010-04-26/30 Principles of XSLT for XQuery Writers: San Francisco,CA 2010-05-03 XSLT/XQuery training: Ottawa, Canada 2010-05-10/14 XSLT/XQuery/UBL/Code List training: Trondheim,Norway 2010-06-02/11 Vote for your XML training: http://www.CraneSoftwrights.com/s/i/ Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/ G. Ken Holman mailto:gkholman@xxxxxxxxxxxxxxxxxxxx Male Cancer Awareness Nov'07 http://www.CraneSoftwrights.com/s/bc Legal business disclaimers: http://www.CraneSoftwrights.com/legal
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] mixed content grouping by, Imsieke, Gerrit, le- | Thread | Re: [xsl] mixed content grouping by, James Cummings |
Re: [xsl] embed Base64 content into, Hermann Stamm-Wilbra | Date | Re: [xsl] embed Base64 content into, Suresh |
Month |