|
Subject: Re: [xsl] Transforming XML Blockquotes - Mixed Content From: James Fuller <jim.fuller@xxxxxxxxxxxxxx> Date: Thu, 14 Apr 2005 03:12:38 +0200 |
Wendell Piez wrote:
> Right. And (sadly) some of us old-timers sighed when we saw the post,
> because we knew (a) the problem wasn't easy, and (b) most attempts to
> handle it deal only with a subset of the actual problem (as you have
> noticed). This is usually okay in practice (often one only *has* a
> subset of the problem), but does require more fine-grained analysis of
> requirements, such as
Wendell is spot on....and this type of problem is probably the largest
use case that XSLT struggles with....
here is another possible approach to solving the problem using a 2
stage transformation (i have used variables so its easy to illustrate
the process)....
XML
<?xml version="1.0" encoding="ISO-8859-1" ?>
<root>
Yadda Yadda Yadda <italic>Italic Yadda</italic> Yadda:
<blockquote>Blah Blah Blah Blah</blockquote>
Yackity <font>Yack</font> Yack and wh
</root>
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="list-of-elements" select="'italic font'"/>
<xsl:template match="root">
<!-- 1st step: admittedly weird kind of tokenization with <p> -->
<xsl:variable name="result">
<xsl:apply-templates/>
</xsl:variable>
<!-- 2nd step: create new tree -->
<xsl:variable name="final">
<xsl:apply-templates select="$result" mode="final"/>
</xsl:variable>
<!-- 3rd step: print out result -->
<xsl:copy-of select="$final"/>
</xsl:template>
<xsl:template match="text()">
<xsl:if test="normalize-space()">
<p><xsl:value-of select="normalize-space(.)"/></p>
</xsl:if>
</xsl:template>
<xsl:template match="*[contains($list-of-elements,name())]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="blockquote"><xsl:copy-of
select="."/></xsl:template>
<xsl:template match="*[contains($list-of-elements,name())]" mode="final">
<p>
<xsl:value-of select="preceding-sibling::node()[1]"/>
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
<xsl:value-of select="following-sibling::node()[1]"/>
</p>
</xsl:template>
<xsl:template
match="p[preceding-sibling::node()[not(contains($list-of-elements,name()))]
and following-sibling::node()[not(contains($list-of-elements,name()))]]"
mode="final"/>
<xsl:template match="p" mode="final">
<xsl:choose>
<xsl:when
test="preceding-sibling::node()[not(contains($list-of-elements,name()))]
and following-sibling::node()[not(contains($list-of-elements,name()))]">
</xsl:when>
<xsl:when
test="preceding-sibling::node()[1][contains($list-of-elements,name())]">
<xsl:copy-of select="."/>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="blockquote" mode="final"><xsl:copy-of
select="."/></xsl:template>
</xsl:stylesheet>
not tested, and pretty ugly
gl, Jim Fuller
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Transforming XML Blockquo, Wendell Piez | Thread | Re: [xsl] Transforming XML Blockquo, David Carlisle |
| Re: [xsl] Total number of pages wit, Eliot Kimber | Date | [xsl] grouping - XSLT 1.0, Lopez, William |
| Month |