xsl-list
[Top] [All Lists]

Re: [xsl] problem with creating structure

2007-11-12 02:04:06



On 11.11.2007 23:31 Uhr, "G. Ken Holman" 
<gkholman(_at_)CraneSoftwrights(_dot_)com>
wrote:

At 2007-11-11 22:48 +0100, Andreas Peter wrote:
Quoting "G. Ken Holman" <gkholman(_at_)CraneSoftwrights(_dot_)com>:
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>Einführung </h2>
       <p>...</p>
       <p>...</p>
       <p>...</p>
       <p>...</p>
       <p>...</p>
       <h2>I.Teil: Der &#65279;Mensch ­ 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>Einführung </h2>
        <p>Außer ihnen gibt es aber auch andere, die vermuten, aus
der Schilderung des inneren
            Erlebens primitiver Stämme mit ihrer einfachen, mehr
geschlossenen Weltanschauung nicht</p>
        <p>Dazu sind die Blicke vieler auf unsere einstigen Kolonien
gerichtet in der bestimmten
            Erwartung, daß uns das Ende des gegenwärtigen Krieges
wieder in den Besitz des</p>
        <p>Entsprechend seinem Beruf hat der Verfasser auch den Titel
seines Buches gewählt. Damit
            mag für viele schon über das Folgende ein Urteil gefällt
sein: Geschaut mit beschränktem
            und voreingenommenem Blick! Nun ist der Verfasser dankbar
manchen Männern der
            Wissenschaft der Heimat, die durch sichtende Arbeit im
Studierzimmer mancherle</p>
...
            <sect1>
                <title>I.Teil: Der &#65279;Mensch ­ ein &#65279;Leib</title>
                <para>Außer ihnen gibt es aber auch andere, die
vermuten, aus der Schilderung des
                 inneren Erlebens primitiver Stämme mit ihrer
einfachen, mehr geschlossenen
                    Weltanschauung nicht nur Schlüsse auf die
Vorgeschichte der Kulturvölker ziehen
                    zu können, sondern daß sie auch Fingerzeige geben
für manche uns noch nicht ganz
                    geklärte Fragen, die der gewaltige Umbruch
unseres heimatlichen Volkslebens im
                    letzten Jahrzehnt uns gestellt [hat]. Welche
Wechselbeziehungen da bestehen
                    können, sieht der besonders, dem ein Einblick in
den Mechanismus des fremden
                    Volkslebens gegeben ist und der auch die Vorgä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>Einführung </h2>
         <p>Außer ihnen gibt es aber auch andere, die vermuten, aus
der Schilderung des inneren
             Erlebens primitiver Stämme mit ihrer einfachen, mehr
geschlossenen Weltanschauung nicht</p>
         <p>Dazu sind die Blicke vieler auf unsere einstigen Kolonien
gerichtet in der bestimmten
             Erwartung, daß uns das Ende des gegenwärtigen Krieges
wieder in den Besitz des</p>
         <p>Entsprechend seinem Beruf hat der Verfasser auch den Titel
seines Buches gewählt. Damit
             mag für viele schon über das Folgende ein Urteil gefällt
sein: Geschaut mit beschränktem
             und voreingenommenem Blick! Nun ist der Verfasser dankbar
manchen Männern der
             Wissenschaft der Heimat, die durch sichtende Arbeit im
Studierzimmer mancherle</p>
         <h2>I.Teil: Der &#65279;Mensch ­ ein &#65279;Leib </h2>
         <h3>Allgemeines</h3>
         <p>So ist auch die Einheit „Mensch“ ein Leib-Geistwesen, denn
im Normalzustand besteht sein
             Körper aus der eyobo „Hülle“, in der, sie ganz
ausfüllend, mudi „die Lebensseele“ webt.
             Sie ist der eigentliche Träger des Lebens. Ohne diese
Lebensseele ist der Mensch in</p>
         <p>Was denkt nun der Kameruner ü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 Gebräuche variieren bei
den verschiedenen Stämmen, in
             den großen Zügen aber ä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>Einführung </title>
          <para>Außer ihnen gibt es aber auch andere, die vermuten, aus
der Schilderung des inneren
             Erlebens primitiver Stämme mit ihrer einfachen, mehr
geschlossenen Weltanschauung nichtDazu sind die
Blicke vieler auf unsere einstigen Kolonien
gerichtet in der bestimmten
             Erwartung, daß uns das Ende des gegenwärtigen Krieges
wieder in den Besitz desEntsprechend seinem Beruf
hat der Verfasser auch den Titel
seines Buches gewählt. Damit
             mag für viele schon über das Folgende ein Urteil gefällt
sein: Geschaut mit beschränktem
             und voreingenommenem Blick! Nun ist der Verfasser dankbar
manchen Männern der
             Wissenschaft der Heimat, die durch sichtende Arbeit im
Studierzimmer mancherle</para>
          <sect1>
             <title>I.Teil: Der Mensch ­ ein Leib </title>
             <para>Außer ihnen gibt es aber auch andere, die vermuten, aus
der Schilderung des inneren
             Erlebens primitiver Stämme mit ihrer einfachen, mehr
geschlossenen Weltanschauung nichtDazu sind die
Blicke vieler auf unsere einstigen Kolonien
gerichtet in der bestimmten
             Erwartung, daß uns das Ende des gegenwärtigen Krieges
wieder in den Besitz desEntsprechend seinem Beruf
hat der Verfasser auch den Titel
seines Buches gewählt. Damit
             mag für viele schon über das Folgende ein Urteil gefällt
sein: Geschaut mit beschränktem
             und voreingenommenem Blick! Nun ist der Verfasser dankbar
manchen Mä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
             Körper aus der eyobo &#132;Hülle&#147;, in der, sie ganz
ausfüllend, mudi &#132;die Lebensseele&#147; webt.
             Sie ist der eigentliche Träger des Lebens. Ohne diese
Lebensseele ist der Mensch inWas denkt nun der
Kameruner über seine leibliche
Existenzform, die seine Lebensseele an
             die Sichtbarkeit bindet? </para>
          </sect2>
          <sect3>
             <title>2. Beerdigungssitten und Totenfeiern bei
den Bakwiri </title>
             <para>Die Einzelheiten der
verschiedenen Gebräuche variieren bei
den verschiedenen Stämmen, in
             den großen Zügen aber ä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(_at_)CraneSoftwrights(_dot_)com
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


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



Hi Ken,

This is exactly what I wanted to do. Thanks a lot.

Andreas



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