On Thu, Apr 10 2008 15:42:36 +0100, ekimber(_at_)reallysi(_dot_)com wrote:
I am working on generating Adobe InCopy article (INCX) files from DITA
source. The challenge I face is that the DITA source is typical
documentation XML, where you have mixed content with embedded inline
elements that may be nested to any depth, e.g.:
<p>Some text <i>italic text <b>now bold italic</b> back to italic</i>
more text</p>
In the INCX representation of this, each text string with distinct
formatting is separately wrapped as a "text run", making the above
into:
<txsr><pcnt>Some text </pcnt></txsr>
<txsr><pcnt>italic text </pcnt></txsr>
<txsr><pcnt>now bold italic</pcnt></txsr>
<txsr><pcnt> back to italic</pcnt></txsr>
<txsr><pcnt> more text& #x0a;</pcnt></txsr>
Here's two one-pass solutions that differ in where you put the style
selection.
The second approach is messier, but it does let you pass the style
information as a parameter (or more than one parameter if you wanted).
You could combine the approaches and build up a sequence as the
parameter value (e.g., "('bold', 'italic')") and then let the template
for text() decide what to do based on what's in the sequence.
Regards,
Tony Graham
Tony(_dot_)Graham(_at_)MenteithConsulting(_dot_)com
Director W3C XSL FO SG Invited Expert
Menteith Consulting Ltd
XML, XSL and XSLT consulting, programming and training
Registered Office: 13 Kelly's Bay Beach, Skerries, Co. Dublin, Ireland
Registered in Ireland - No. 428599 http://www.menteithconsulting.com
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
xmlroff XSL Formatter http://xmlroff.org
xslide Emacs mode http://www.menteith.com/wiki/xslide
Unicode: A Primer urn:isbn:0-7645-4625-2
------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xml"/>
<xsl:template match="p">
<xsl:for-each select=".//text()">
<txsr>
<xsl:attribute name="style">
<xsl:choose>
<xsl:when test="ancestor::b and ancestor::i">
<xsl:text>bold-italic</xsl:text>
</xsl:when>
<xsl:when test="ancestor::b">
<xsl:text>bold</xsl:text>
</xsl:when>
<xsl:when test="ancestor::i">
<xsl:text>italic</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>default</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xcnt>
<xsl:value-of select="translate(., '
', ' ')"/>
<xsl:if test="position() = last()">
<xsl:text>
</xsl:text>
</xsl:if>
</xcnt>
</txsr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
------------------------------------------------------------
------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xml"/>
<xsl:strip-space elements="test"/>
<xsl:template match="p">
<xsl:apply-templates>
<xsl:with-param name="style" select="'default'"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="text()">
<xsl:param name="style" as="xs:string" required="yes"/>
<txsr style="{$style}">
<xcnt>
<xsl:value-of select="translate(., '
', ' ')"/>
<xsl:if test="not(exists(following::text()[1])) or
(exists(following::p[1]) and
not(following::text()[1] << following::p[1]))">
<xsl:text>
</xsl:text>
</xsl:if>
</xcnt>
</txsr>
</xsl:template>
<xsl:template match="b">
<xsl:param name="style" as="xs:string" required="yes"/>
<xsl:variable name="new-style">
<xsl:choose>
<xsl:when test="$style = 'italic'">
<xsl:text>bold-italic</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>bold</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:apply-templates>
<xsl:with-param name="style" select="$new-style"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="i">
<xsl:param name="style" as="xs:string" required="yes"/>
<xsl:variable name="new-style">
<xsl:choose>
<xsl:when test="$style = 'bold'">
<xsl:text>bold-italic</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>italic</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:apply-templates>
<xsl:with-param name="style" select="$new-style"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
------------------------------------------------------------
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--