Re: [xsl] problem with creating structure

Subject: Re: [xsl] problem with creating structure
From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
Date: Sun, 11 Nov 2007 17:31:59 -0500
At 2007-11-11 22:48 +0100, Andreas Peter wrote:
Quoting "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>:
At 2007-11-11 22:05 +0100, Andreas Peter wrote:
XSL exasperates me! I have the following XML structure:

<Root>
   <Textabschnitt>
       <h1>Geistiger Volksbesitz der Kameruner im Blickfeld des
Missionars</h1>
       <h2>EinfCB<hrung </h2>
       <p>...</p>
       <p>...</p>
       <p>...</p>
       <p>...</p>
       <p>...</p>
       <h2>I.Teil: Der &#65279;Mensch CB- ein &#65279;Leib </h2>
       <h3>Allgemeines </h3>
       <p>...</p>
       <p>...</p>
       <p>...</p>
       <p>...</p>
       <p>...</p>
   </Textabschnitt>
</Root>

This should be transformed into the following XML structure:

<set>
   <book>
       <bookinfo/>
       <title/>
       <chapter>
           <title/>
           <para/>
           <sect1>
               <title/>
               <para/>
           </sect1>
           <sect2>
               <title/>
               <para/>
           </sect2>
           <sect3>
               <title/>
               <para/>
           </sect3>
       </chapter>
   </book>
</set>

I want to insert an element <chapter> before the element <h2> but only
for the first element <h2>. The second element <h2> should be
transformed to <title>. And I need to output every <p> element
according to its proir element until the next <h2>, <h3>, ... occures.

Wow ... okay ... now looking at your data I can see what you want (not why, but that doesn't have to be justified).

But I am concerned that the end of the text in
the paragraph under <sect1> doesn't match the
content after the first <h2> ... I implied from
your definition that the same text appears twice:

        <h2>EinfC<hrung </h2>
        <p>AuCer ihnen gibt es aber auch andere, die vermuten, aus
der Schilderung des inneren
            Erlebens primitiver StC$mme mit ihrer einfachen, mehr
geschlossenen Weltanschauung nicht</p>
        <p>Dazu sind die Blicke vieler auf unsere einstigen Kolonien
gerichtet in der bestimmten
            Erwartung, daC uns das Ende des gegenwC$rtigen Krieges
wieder in den Besitz des</p>
        <p>Entsprechend seinem Beruf hat der Verfasser auch den Titel
seines Buches gewC$hlt. Damit
            mag fC<r viele schon C<ber das Folgende ein Urteil gefC$llt
sein: Geschaut mit beschrC$nktem
            und voreingenommenem Blick! Nun ist der Verfasser dankbar
manchen MC$nnern der
            Wissenschaft der Heimat, die durch sichtende Arbeit im
Studierzimmer mancherle</p>
...
            <sect1>
                <title>I.Teil: Der &#65279;Mensch B- ein
&#65279;Leib</title>
                <para>AuCer ihnen gibt es aber auch andere, die
vermuten, aus der Schilderung des
                 inneren Erlebens primitiver StC$mme mit ihrer
einfachen, mehr geschlossenen
                    Weltanschauung nicht nur SchlC<sse auf die
Vorgeschichte der KulturvC6lker ziehen
                    zu kC6nnen, sondern daC sie auch Fingerzeige geben
fC<r manche uns noch nicht ganz
                    geklC$rte Fragen, die der gewaltige Umbruch
unseres heimatlichen Volkslebens im
                    letzten Jahrzehnt uns gestellt [hat]. Welche
Wechselbeziehungen da bestehen
                    kC6nnen, sieht der besonders, dem ein Einblick in
den Mechanismus des fremden
                    Volkslebens gegeben ist und der auch die VorgC$nge
in der Heimat mit pochendem
                    Herzen verfolgt und miterlebt hat.</para>
            </sect1>

I'm guessing that this is just a copy/paste problem, as I otherwise don't see why the text should be different.

So I think the following is an XSLT 2 approach to
your problem.  Right away one should think of
using group-starting-with= because you are moving
from a flat structure to a nested structure.

I hope this helps!

. . . . . . . . . . . . . Ken


t:\ftemp>type andreas.xml <Root> <Textabschnitt> <h1>Geistiger Volksbesitz der Kameruner im Blickfeld des Missionars </h1> <h2>EinfC<hrung </h2> <p>AuCer ihnen gibt es aber auch andere, die vermuten, aus der Schilderung des inneren Erlebens primitiver StC$mme mit ihrer einfachen, mehr geschlossenen Weltanschauung nicht</p> <p>Dazu sind die Blicke vieler auf unsere einstigen Kolonien gerichtet in der bestimmten Erwartung, daC uns das Ende des gegenwC$rtigen Krieges wieder in den Besitz des</p> <p>Entsprechend seinem Beruf hat der Verfasser auch den Titel seines Buches gewC$hlt. Damit mag fC<r viele schon C<ber das Folgende ein Urteil gefC$llt sein: Geschaut mit beschrC$nktem und voreingenommenem Blick! Nun ist der Verfasser dankbar manchen MC$nnern der Wissenschaft der Heimat, die durch sichtende Arbeit im Studierzimmer mancherle</p> <h2>I.Teil: Der &#65279;Mensch B- ein &#65279;Leib </h2> <h3>Allgemeines</h3> <p>So ist auch die Einheit BMenschB ein Leib-Geistwesen, denn im Normalzustand besteht sein KC6rper aus der eyobo BHC<lleB, in der, sie ganz ausfC<llend, mudi Bdie LebensseeleB webt. Sie ist der eigentliche TrC$ger des Lebens. Ohne diese Lebensseele ist der Mensch in</p> <p>Was denkt nun der Kameruner C<ber seine leibliche Existenzform, die seine Lebensseele an die Sichtbarkeit bindet? </p> <h4>2. &#65279;Beerdigungssitten und &#65279;Totenfeiern bei den <name_group>Bakwiri </name_group></h4> <p>Die Einzelheiten der verschiedenen GebrC$uche variieren bei den verschiedenen StC$mmen, in den groCen ZC<gen aber C$hneln sie sich. </p> </Textabschnitt> </Root> t:\ftemp>type andreas.xsl <?xml version="1.0" encoding="US-ASCII"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; exclude-result-prefixes="xsd" version="2.0">

<xsl:output indent="yes"/>

<!--main structure-->
<xsl:template match="/">
  <set>
    <book>
      <bookinfo/>
      <xsl:apply-templates/>
    </book>
  </set>
</xsl:template>

<!--main content-->
<xsl:template match="Textabschnitt">
  <!--only handle the title and the first expected section-->
  <xsl:apply-templates select="h1 | h2[1]"/>
</xsl:template>

<!--do a title-->
<xsl:template match="h1">
  <title><xsl:apply-templates/></title>
</xsl:template>

<!--catch the first section and reconstruct the content as a chapter-->
<xsl:template match="h2">
  <chapter>
    <!--put out the first H2 as content-->
    <title><xsl:apply-templates/></title>
    <para>
      <xsl:for-each-group select="following-sibling::*"
                          group-starting-with="h2|h3|h4">
        <xsl:if test="position()=1">
          <!--copy the first H2 as the body text-->
          <xsl:copy-of select="current-group()[self::p]/node()"/>
        </xsl:if>
      </xsl:for-each-group>
    </para>
    <!--put out the first content *again* but
using the second H2 as a title-->
    <xsl:for-each-group select=". | following-sibling::*"
                        group-starting-with="h2|h3|h4">
      <!--determine the paragraph content regardless of where we are-->
      <xsl:variable name="section-content">
        <para>
          <xsl:copy-of select="current-group()[self::p]/node()"/>
        </para>
      </xsl:variable>
      <xsl:choose>
        <xsl:when test="position()=1">
          <!--must be repeating the first content, so use the second H2
              for the title-->
          <sect1>
            <title>
              <xsl:apply-templates select="following-sibling::h2/node()"/>
            </title>
            <xsl:copy-of select="$section-content"/>
          </sect1>
        </xsl:when>
        <xsl:when test="self::h2">
          <!--do nothing because the second H2 has already been handled-->
        </xsl:when>
        <xsl:otherwise>
          <!--this is a subsequent section-->
          <xsl:element name="sect{number(substring-after(name(.),'h')) -
1}">
            <title><xsl:apply-templates/></title>
            <xsl:copy-of select="$section-content"/>
          </xsl:element>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each-group>
  </chapter>
</xsl:template>

</xsl:stylesheet>
t:\ftemp>call xslt2 andreas.xml andreas.xsl andreas.out

t:\ftemp>type andreas.out
<?xml version="1.0" encoding="UTF-8"?>
<set>
   <book>
      <bookinfo/>
      <title>Geistiger Volksbesitz der Kameruner im Blickfeld des
Missionars </title>
      <chapter>
         <title>EinfC<hrung </title>
         <para>AuCer ihnen gibt es aber auch andere, die vermuten, aus
der Schilderung des inneren
            Erlebens primitiver StC$mme mit ihrer einfachen, mehr
geschlossenen Weltanschauung nichtDazu sind die
Blicke vieler auf unsere einstigen Kolonien
gerichtet in der bestimmten
            Erwartung, daC uns das Ende des gegenwC$rtigen Krieges
wieder in den Besitz desEntsprechend seinem Beruf
hat der Verfasser auch den Titel
seines Buches gewC$hlt. Damit
            mag fC<r viele schon C<ber das Folgende ein Urteil gefC$llt
sein: Geschaut mit beschrC$nktem
            und voreingenommenem Blick! Nun ist der Verfasser dankbar
manchen MC$nnern der
            Wissenschaft der Heimat, die durch sichtende Arbeit im
Studierzimmer mancherle</para>
         <sect1>
            <title>I.Teil: Der o;?Mensch B- ein o;?Leib </title>
            <para>AuCer ihnen gibt es aber auch andere, die vermuten, aus
der Schilderung des inneren
            Erlebens primitiver StC$mme mit ihrer einfachen, mehr
geschlossenen Weltanschauung nichtDazu sind die
Blicke vieler auf unsere einstigen Kolonien
gerichtet in der bestimmten
            Erwartung, daC uns das Ende des gegenwC$rtigen Krieges
wieder in den Besitz desEntsprechend seinem Beruf
hat der Verfasser auch den Titel
seines Buches gewC$hlt. Damit
            mag fC<r viele schon C<ber das Folgende ein Urteil gefC$llt
sein: Geschaut mit beschrC$nktem
            und voreingenommenem Blick! Nun ist der Verfasser dankbar
manchen MC$nnern der
            Wissenschaft der Heimat, die durch sichtende Arbeit im
Studierzimmer mancherle</para>
         </sect1>
         <sect2>
            <title>Allgemeines</title>
            <para>So ist auch die Einheit
&#132;Mensch&#147; ein Leib-Geistwesen, denn
im Normalzustand besteht sein
            KC6rper aus der eyobo &#132;HC<lle&#147;, in der, sie ganz
ausfC<llend, mudi &#132;die Lebensseele&#147; webt.
            Sie ist der eigentliche TrC$ger des Lebens. Ohne diese
Lebensseele ist der Mensch inWas denkt nun der
Kameruner C<ber seine leibliche
Existenzform, die seine Lebensseele an
            die Sichtbarkeit bindet? </para>
         </sect2>
         <sect3>
            <title>2. o;?Beerdigungssitten und o;?Totenfeiern bei
den Bakwiri </title>
            <para>Die Einzelheiten der
verschiedenen GebrC$uche variieren bei
den verschiedenen StC$mmen, in
            den groCen ZC<gen aber C$hneln sie sich. </para>
         </sect3>
      </chapter>
   </book>
</set>
t:\ftemp>rem Done!



--
Comprehensive in-depth XSLT2/XSL-FO1.1 classes: Austin TX,Jan-2008
World-wide corporate, govt. & user group XML, XSL and UBL training
RSS feeds:     publicly-available developer resources and training
G. Ken Holman                 mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0    +1(613)489-0999 (F:-0995)
Male Cancer Awareness Nov'07  http://www.CraneSoftwrights.com/s/bc
Legal business disclaimers:  http://www.CraneSoftwrights.com/legal

Current Thread