xsl-list
[Top] [All Lists]

[xsl] XSLT 2.0 grouping and text nodes and mixed text

2009-12-08 18:52:55

Relative newbie question: XSLT 2.0, grouping with text nodes and mixed text

I'm trying to convert a non-XML dictionary into XML. I've got it mostly done, but I want to input
elements that currently look like

<examples>
   <hop>source sentence 1</hop>
   translation of source sentence 1
   <hop>source sentence 2</hop>
   translation of source sentence 2
   <hop>source sentence 3</hop>
   a translation can be <emph>mixed</emph> text
</examples>

and transform them into this

<examples>
    <example-pair>
       <hop>source sentence 1</hop>
       <eng>translation of source sentence 1</eng>
   </example-pair>
   <example-pair>
      <hop>source sentence 2</hop>
      <eng>translation of source sentence 2</eng>
   </example-pair>
   <example-pair>
      <hop>source sentence 3</hop>
      <eng>a translation can be <emph>mixed</emph> text</eng>
   </example-pair>
</examples>

i.e. each original <hop> element in <examples> is followed by plain text or mixed text, not containing <hop> or <examples> elements. I want to group the nodes after each <hop> element and wrap them in <eng>...</eng> tags. I tried the following, and a few other variations, but the desired <eng> element comes out an empty <eng/>


<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform ">

        <xsl:output method="xml" indent="yes"/>

        <xsl:template match="examples">
                <examples>
                <xsl:for-each-group select="*" group-starting-with="hop">
                        <example-pair>
                                <!-- copy the hop element-->
                                <xsl:copy-of select="."/>
                                <!-- and then surround the mixed text following 
the hop element
                                         with eng tags -->
                                <eng>
                                        <xsl:apply-templates select="current-group() 
except ."/>
                                </eng>
                        </example-pair>
                </xsl:for-each-group>
                </examples>
        </xsl:template>

        <!-- default copying of the document -->
        <xsl:template match="@*|node()">
                <xsl:copy>
                        <xsl:apply-templates select="@*|node()"/>
                </xsl:copy>
        </xsl:template>

</xsl:stylesheet>

Would some kind guru please tell me how I can do this?

Thanks,

Ken

******************************
Kenneth R. Beesley, D.Phil.
P.O. Box 540475
North Salt Lake, UT
84054  USA






--~------------------------------------------------------------------
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>
--~--

<Prev in Thread] Current Thread [Next in Thread>