Mixed Content

1. Resolving mixed text inlines

1.

Resolving mixed text inlines

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>