xsl-list
[Top] [All Lists]

Re: [xsl] processing following-siblings to a point

2009-07-09 15:12:13
At 2009-07-09 18:59 +0000, charlieo0(_at_)comcast(_dot_)net wrote:
I've run into a structure that I must transform that I just haven't found a solution for. XSL 1.0 only. (I just don't have the proficiency for 2.0 yet).

Then this is your chance to learn!  :{)}

I'm transforming what was a rather flat SGML structure to an XML structure. Here's the input structure:
...
Resulting structure tree:
...

My template (or at least the important part).

    <xsl:template match="gen/title" mode="move">

        <para0>
            <title>
                <xsl:value-of select="."/>
            </title>
            <subpara1>
<title><xsl:value-of select="following-sibling::subtitle[1]"/></title>
                <xsl:apply-templates select="following-sibling::para"/>
            </subpara1>
        </para0>

My problem is with the <xsl:apply-templates select="following-sibling::para"/> line. Of course, all of the para elements are following siblings of all the gen/title elements. How can I express the <apply-templates> to process only the para element siblings BEFORE the next following title sibling. (This is difficult because EVERYTHING is a sibling of everything else).

Precisely! And for this reason, attacking the problem with XSLT 1.0 is a royal pain. You probably need a template to match sibling elements, then process one sibling at a time. Not pretty.

I will let another volunteer undertake to show you the answer using XSLT 1 ... below is an answer using XSLT 2.

I hope this helps (if not now, then in the future when you finally embrace XSLT 2).

. . . . . . . . . . Ken


T:\ftemp>type charlie.xml
<gen>
<title>TITLE_1</title>
<subtitle>SUBTITLE_1</subtitle>
<para>Text.</para>
<para>Text.</para>
<para>Text.</para>
<title>TITLE_2</title>
<subtitle>SUBTITLE_2</subtitle>
<para>Text.</para>
<para>Text.</para>
<para>Text.</para>
<para>Text.</para>
<title>TITLE_3</title>
<subtitle>SUBTITLE_3</subtitle>
<para>Text.</para>
<para>Text.</para>
<para>Text.</para>
<para>Text.</para>
</gen>

T:\ftemp>call xslt2 charlie.xml charlie.xsl
<?xml version="1.0" encoding="UTF-8"?>
<para0>
   <title>TITLE_1</title>
   <subpara1>
      <title>SUBTITLE_1</title>
      <para>Text.</para>
      <para>Text.</para>
      <para>Text.</para>
   </subpara1>
</para0>
<para0>
   <title>TITLE_2</title>
   <subpara1>
      <title>SUBTITLE_2</title>
      <para>Text.</para>
      <para>Text.</para>
      <para>Text.</para>
      <para>Text.</para>
   </subpara1>
</para0>
<para0>
   <title>TITLE_3</title>
   <subpara1>
      <title>SUBTITLE_3</title>
      <para>Text.</para>
      <para>Text.</para>
      <para>Text.</para>
      <para>Text.</para>
   </subpara1>
</para0>
T:\ftemp>type charlie.xsl
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                version="2.0">

<xsl:output indent="yes"/>

<xsl:template match="gen">
  <xsl:for-each-group select="*" group-starting-with="title">
    <para0>
      <xsl:copy-of select="."/>
      <subpara1>
        <xsl:for-each select="current-group()[self::subtitle]">
          <title>
            <xsl:copy-of select="node()"/>
          </title>
        </xsl:for-each>
        <xsl:copy-of
            select="current-group()[not(self::title|self::subtitle)]"/>
      </subpara1>
    </para0>
  </xsl:for-each-group>
</xsl:template>

</xsl:stylesheet>

T:\ftemp>rem Done!



--
Possible July/August XSLT/XQuery/XSL-FO training in Oakland/CA/USA
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
Training tools: Comprehensive interactive XSLT/XPath 1.0/2.0 video
Video lesson:    http://www.youtube.com/watch?v=PrNjJCh7Ppg&fmt=18
Video overview:  http://www.youtube.com/watch?v=VTiodiij6gE&fmt=18
G. Ken Holman                 mailto:gkholman(_at_)CraneSoftwrights(_dot_)com
Male Cancer Awareness Nov'07  http://www.CraneSoftwrights.com/s/bc
Legal business disclaimers:  http://www.CraneSoftwrights.com/legal


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