xsl-list
[Top] [All Lists]

Re: (Probably trivial) grouping problem

2003-07-19 03:38:50
Use the following transformation:

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

 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:strip-space elements="*"/>

 <xsl:key  name="kFollParas" match="para[not(@title)]"
  use="generate-id(preceding-sibling::para[(_at_)title][1])"/>

  <xsl:template match="para[(_at_)title]">
    <section>
      <title><xsl:value-of select="@title"/></title>
      <para><xsl:value-of select="."/></para>
      <xsl:copy-of select="key('kFollParas', generate-id())"/>
    </section>
  </xsl:template>
  <xsl:template match="para[not(@title)]"/>
</xsl:stylesheet>


When applied on your source.xml:

<text>
  <para title="title1">
        some text
  </para>
  <para>
        a para without a title
  </para>
  <para title="title2">
        more text
  </para>
  <para>
        yet another untitled para
  </para>
</text>


the wanted result is produced:

<section>
   <title>title1</title>
   <para>
        some text
  </para>
   <para>
        a para without a title
  </para>
</section>
<section>
   <title>title2</title>
   <para>
        more text
  </para>
   <para>
        yet another untitled para
  </para>
</section>


Hope this helped.


=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL

"Stefan Tilkov" <stefan(_dot_)tilkov(_at_)innoq(_dot_)com> wrote in message
news:OFF1F431D7(_dot_)102B9DE9-ONC1256D68(_dot_)002AEF58-C1256D68(_dot_)002AFA73(_at_)innoq(_dot_)org(_dot_)(_dot_)(_dot_)
I can't for the life of me figure out how to solve a simple problem. I
know that it is related to grouping, but my XSL (and XPath) knowlegde is
not up to translating answers given to similar problems to my particular
case.

I have a couple of paragrahps, marked up this way:

<para title="title1">
        some text
</para>
<para>
        a para without a title
</para>
<para title="title2">
        more text
</para>
<para>
        yet another untitled para
</para>

I want to turn them into this:

<section>
        <title>title1</title>
        <para>
                some text
        </para>
        <para>
                a para without a title
        </para>
</section>
<section>
        <title>title2</title>
        <para>
                more text
        </para>
        <para>
                yet another untitled para
        </para>
</section>

That is, I want to create sections from paragraphs, turning the title into
an element belonging to the section. My experiments with following-sibling
and preceeding-sibling all had the problem that *all* paragraphs without a
title were returned, and I somehow need to get access to only those before
the next para with a title.

Any help would be greatly appreciated.

Stefan

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list






 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



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