Re: [xsl] problem with creating structure

Subject: Re: [xsl] problem with creating structure
From: Andreas <info@xxxxxxxxxx>
Date: Mon, 12 Nov 2007 10:03:28 +0100
On 11.11.2007 23:31 Uhr, "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
wrote:

> 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>EinfCFCB<hrung </h2>
>>>>        <p>...</p>
>>>>        <p>...</p>
>>>>        <p>...</p>
>>>>        <p>...</p>
>>>>        <p>...</p>
>>>>        <h2>I.Teil: Der &#65279;Mensch CbCB- 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>EinfCB<hrung </h2>
>>         <p>AuCE8er ihnen gibt es aber auch andere, die vermuten, aus
>> der Schilderung des inneren
>>             Erlebens primitiver StCB$mme mit ihrer einfachen, mehr
>> geschlossenen Weltanschauung nicht</p>
>>         <p>Dazu sind die Blicke vieler auf unsere einstigen Kolonien
>> gerichtet in der bestimmten
>>             Erwartung, daCE8 uns das Ende des gegenwCB$rtigen Krieges
>> wieder in den Besitz des</p>
>>         <p>Entsprechend seinem Beruf hat der Verfasser auch den Titel
>> seines Buches gewCB$hlt. Damit
>>             mag fCB<r viele schon CB<ber das Folgende ein Urteil
gefCB$llt
>> sein: Geschaut mit beschrCB$nktem
>>             und voreingenommenem Blick! Nun ist der Verfasser dankbar
>> manchen MCB$nnern der
>>             Wissenschaft der Heimat, die durch sichtende Arbeit im
>> Studierzimmer mancherle</p>
>> ...
>>             <sect1>
>>                 <title>I.Teil: Der &#65279;Mensch CB- ein
&#65279;Leib</title>
>>                 <para>AuCE8er ihnen gibt es aber auch andere, die
>> vermuten, aus der Schilderung des
>>                  inneren Erlebens primitiver StCB$mme mit ihrer
>> einfachen, mehr geschlossenen
>>                     Weltanschauung nicht nur SchlCB<sse auf die
>> Vorgeschichte der KulturvCB6lker ziehen
>>                     zu kCB6nnen, sondern daCE8 sie auch Fingerzeige
geben
>> fCB<r manche uns noch nicht ganz
>>                     geklCB$rte Fragen, die der gewaltige Umbruch
>> unseres heimatlichen Volkslebens im
>>                     letzten Jahrzehnt uns gestellt [hat]. Welche
>> Wechselbeziehungen da bestehen
>>                     kCB6nnen, sieht der besonders, dem ein Einblick in
>> den Mechanismus des fremden
>>                     Volkslebens gegeben ist und der auch die VorgCB$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>EinfCB<hrung </h2>
>          <p>AuCE8er ihnen gibt es aber auch andere, die vermuten, aus
> der Schilderung des inneren
>              Erlebens primitiver StCB$mme mit ihrer einfachen, mehr
> geschlossenen Weltanschauung nicht</p>
>          <p>Dazu sind die Blicke vieler auf unsere einstigen Kolonien
> gerichtet in der bestimmten
>              Erwartung, daCE8 uns das Ende des gegenwCB$rtigen Krieges
> wieder in den Besitz des</p>
>          <p>Entsprechend seinem Beruf hat der Verfasser auch den Titel
> seines Buches gewCB$hlt. Damit
>              mag fCB<r viele schon CB<ber das Folgende ein Urteil
gefCB$llt
> sein: Geschaut mit beschrCB$nktem
>              und voreingenommenem Blick! Nun ist der Verfasser dankbar
> manchen MCB$nnern der
>              Wissenschaft der Heimat, die durch sichtende Arbeit im
> Studierzimmer mancherle</p>
>          <h2>I.Teil: Der &#65279;Mensch CB- ein &#65279;Leib </h2>
>          <h3>Allgemeines</h3>
>          <p>So ist auch die Einheit CbMenschCb ein Leib-Geistwesen,
denn
> im Normalzustand besteht sein
>              KCB6rper aus der eyobo CbHCB<lleCb, in der, sie ganz
> ausfCB<llend, mudi Cbdie LebensseeleCb webt.
>              Sie ist der eigentliche TrCB$ger des Lebens. Ohne diese
> Lebensseele ist der Mensch in</p>
>          <p>Was denkt nun der Kameruner CB<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 GebrCB$uche variieren bei
> den verschiedenen StCB$mmen, in
>              den groCE8en ZCB<gen aber CB$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>EinfCB<hrung </title>
>           <para>AuCE8er ihnen gibt es aber auch andere, die vermuten, aus
> der Schilderung des inneren
>              Erlebens primitiver StCB$mme mit ihrer einfachen, mehr
> geschlossenen Weltanschauung nichtDazu sind die
> Blicke vieler auf unsere einstigen Kolonien
> gerichtet in der bestimmten
>              Erwartung, daCE8 uns das Ende des gegenwCB$rtigen Krieges
> wieder in den Besitz desEntsprechend seinem Beruf
> hat der Verfasser auch den Titel
> seines Buches gewCB$hlt. Damit
>              mag fCB<r viele schon CB<ber das Folgende ein Urteil
gefCB$llt
> sein: Geschaut mit beschrCB$nktem
>              und voreingenommenem Blick! Nun ist der Verfasser dankbar
> manchen MCB$nnern der
>              Wissenschaft der Heimat, die durch sichtende Arbeit im
> Studierzimmer mancherle</para>
>           <sect1>
>              <title>I.Teil: Der C/B;B?Mensch CB- ein C/B;B?Leib </title>
>              <para>AuCE8er ihnen gibt es aber auch andere, die vermuten,
aus
> der Schilderung des inneren
>              Erlebens primitiver StCB$mme mit ihrer einfachen, mehr
> geschlossenen Weltanschauung nichtDazu sind die
> Blicke vieler auf unsere einstigen Kolonien
> gerichtet in der bestimmten
>              Erwartung, daCE8 uns das Ende des gegenwCB$rtigen Krieges
> wieder in den Besitz desEntsprechend seinem Beruf
> hat der Verfasser auch den Titel
> seines Buches gewCB$hlt. Damit
>              mag fCB<r viele schon CB<ber das Folgende ein Urteil
gefCB$llt
> sein: Geschaut mit beschrCB$nktem
>              und voreingenommenem Blick! Nun ist der Verfasser dankbar
> manchen MCB$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
>              KCB6rper aus der eyobo &#132;HCB<lle&#147;, in der, sie ganz
> ausfCB<llend, mudi &#132;die Lebensseele&#147; webt.
>              Sie ist der eigentliche TrCB$ger des Lebens. Ohne diese
> Lebensseele ist der Mensch inWas denkt nun der
> Kameruner CB<ber seine leibliche
> Existenzform, die seine Lebensseele an
>              die Sichtbarkeit bindet? </para>
>           </sect2>
>           <sect3>
>              <title>2. C/B;B?Beerdigungssitten und C/B;B?Totenfeiern bei
> den Bakwiri </title>
>              <para>Die Einzelheiten der
> verschiedenen GebrCB$uche variieren bei
> den verschiedenen StCB$mmen, in
>              den groCE8en ZCB<gen aber CB$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
>
>

Hi Ken,

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

Andreas

Current Thread