xsl-list
[Top] [All Lists]

Re: [xsl] problem with creating structure

2007-11-11 15:33:40
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>
--~--