Mike Kay
> I am processing XML to XML by using XSL style sheet and Saxonb 8.0
>
> My source XML file
> <root>
> <p>some text</p>
> <p>some text <i>italic text</i></p>
> <p>some text <b><i>bold+italic text</i> bold text</b></p> <p>some text
> <i>italic text <sub>subscript+italic text</sub></i> some text</p>
> <p>some text <b>bold text <i>Italic text</i> bold continues
> <i>x<inf>2</inf></i> bold continues</b></p> </root>
>
> I need my resulting XML file as
> <root>
> <para>some text</para>
> <para>some text <render font-style="italic">italic
> text</render></para> <para>some text <render font-weight="bold"
> font-style="italic">bold+italic text</render><render
> font-weight="bold"> bold text</render></para> <para>some text <render
> font-style="italic">italic text </render><render font-style="italic"
> baseline-shift="sub"
> font-size="smaller">subscript+italic text</render> some text</para>
> <para>some text <render font-weight="bold">bold text </render><render
> font-weight="bold"
> font-style="italic">bold+Italic text</render><render
> font-weight="bold"> bold continues </render><render font-weight="bold"
> font-style="italic">x</render><render
> font-weight="bold" baseline-shift="sub"
> font-size="smaller">2</render><render font-weight="bold"> bold
> continues</render></para> </root>
>
I think I would tackle this in the template that matches the text nodes, something like this:
<xsl:template match="para//i/text() | para//b/text() | para//inf/text()">
<render>
<xsl:if test="ancestor::i">
<xsl:attribute name="font-style">italic</xsl:attribute>
</xsl:if>
<xsl:if test="ancestor::b">
<xsl:attribute name="font-weight">bold</xsl:attribute>
</xsl:if>
<xsl:if test="ancestor::inf">
<xsl:attribute name="baseline-shift">sub</xsl:attribute>
<xsl:attribute name="font-size">smaller</xsl:attribute>
</xsl:if>
<xsl:value-of select="."/>
</render>
</xsl:template>
|