Re: [xsl] problem with processing nodes

Subject: Re: [xsl] problem with processing nodes
From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
Date: Wed, 19 Dec 2007 16:00:09 -0500
At 2007-12-19 20:15 +0100, Andreas Peter wrote:
I have a problem with processing several nodes. My input document looks
like the following:
...
I use the following XSL for output:
...
The output should like this:

Here I'm stuck ... I cannot see why two <h2> elements are in the same <Ebene2> and I've tried many ways to get them both into one and I've given up:

<Ebene2>
<h2>1.2 Leben und Werk Ittmanns im C&#65533;berblick<fn>Die
biographischen Daten
beruhen auf einem Nachruf zu Ittmann (KCBhler-Meyer 1964), ...</fn></h2>
<p>Ittmann schilderte mitunter, wie er selbst wCBhrend der Reise auf
FuC&#65533;mCBrschen seine afrikanischen Begleiter befragte. ...</p>
<h2>1.3 Quellenlage, Eingrenzung, Aufbau und Methodik</h2>
<p>Aus Ittmanns reichhaltigem Schaffen galt es inhaltlich auszuwCBhlen
...</p>
</Ebene2>

I cannot take any more time to try and figure out the above, but for the rest, I think the code below does what you need.

Everything works fine except the <p>-elements from the
xsl:for-each-group. They are not processed properly.

Unfortunately, you don't explain what "properly" is, so I had to guess.


Any idea from the experts?

Making it a guessing game is not fun and it takes a lot of time ... in the future I suggest you put into words what you need, in addition to the data, so that volunteers don't have to guess. I cannot figure out why <p> elements are sometimes grouped and sometimes not. I added comments to explain the assertions I assumed.

Note the changes I made in the copying of node
titles (your code was losing the <name_geo>
structure), and in the composition of element
names using an attribute value template (you had
a redundant XPath if expression).

I hope the code below helps get you started, but I can't help with the above.

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

p.s. also, my mailer does not handle UTF-8 well
... can you post examples with an XML declaration
of ISO-8859-1 (Latin1) so that old mail systems don't get confused?


t:\ftemp>type andreas.xml <?xml version="1.0" encoding="UTF-8"?> <Root> <h01>Evangelium, afrikanisches Volkstum und geistiger Volksbesitz im Denken des Missionars Johannes Ittmann</h01> <h02>bis zum ersten groen <name_geo>Jamaika</name_geo>-Manuskript (ca. 1943) im Zusammenhang der deutschen missionstheologischen Debatte 19091940</h02> <h03>Magisterschrift</h03> <p>zum Erwerb des Mag. theol.</p> <p>nach der Ordnung der</p> <bildunterschrift> <p>Johannes Ittmann (18851963)</p> </bildunterschrift>

   <h1>1. Einleitung</h1>
   <h2>1.1 Gott kommt frAOher als der
Missionar</h2>
   <p>Gott kommt frAOher als der
Missionar so titelt ein Buch des
Befreiungstheologen Leonardo
Boff (1992). ...</p>
   <p_e>Ittmann steht im Kontext der deutschen Missionstheologie seiner
Zeit, die davon ausgeht,
da das Volkstum
 ...</p_e>
   <h2>1.2 Leben und Werk Ittmanns im berblick<fn>Die
biographischen Daten
beruhen auf einem
Nachruf zu Ittmann (KA?hler-Meyer 1964), ...</fn>
   </h2>
   <p>Ittmann schilderte mitunter, wie er selbst whrend der Reise auf
FuArschen seine
afrikanischen Begleiter befragte. ...</p>
   <h2>1.3 Quellenlage, Eingrenzung, Aufbau und Methodik</h2>
   <p>Aus Ittmanns reichhaltigem Schaffen galt es inhaltlich auszuwhlen
...</p>

   <h1>2. Gott kommt frAOher als der
Missionar Inwiefern?</h1>
   <h2>2.1 Einleitendes</h2>
   <p>Gott kommt frAOher als der
Missionar  so habe ich mit Leonardo
Boff
in der Einleitung
Ittmanns...</p>
   <h3>2.1.1 Grobgestalt</h3>
   <p>Die etwa 200 Seiten des Manuskriptes gliedern sich in eine Einleitung
von sechs Seiten und
vier Hauptteile:</p>
   <h3>2.1.2 Ziele und Zielgruppen</h3>
   <p>In der EinfAOhrung {I-VI} nennt Ittmann fAOnf Zielgruppen und
entsprechende Ziele:</p>
   <h3>2.1.3 Methodenreflexion</h3>
   <p>Gerade der letzte Punkt fordert ihn zur Klarlegung seiner Methode:
...</p>
   <h4>Zu B. Leibesleben zwischen Geburt und Tod {14-24}</h4>
   <p>Hier kommen beide zunA?chst auf die Beschneidung zu sprechen.
Johanssen (1931, 199-201)
...</p>
</Root>
t:\ftemp>type andreas.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="2.0">
<xsl:output indent="yes"/>

<xsl:template match="/">
   <Teil>
      <xsl:apply-templates select="Root"/>
   </Teil>
</xsl:template>

<xsl:template match="Root">
   <Titelei>
      <xsl:call-template name="titelei"/>
   </Titelei>
   <inhalt>
      <xsl:call-template name="inhalt"/>
   </inhalt>
</xsl:template>

<xsl:template name="titelei">
   <xsl:param name="t" select="1"/>
   <xsl:param name="nodes" select="*"/>
   <!--group according to the expected level-->
   <xsl:for-each-group select="$nodes"
                       group-starting-with="*[name()=concat('h0',$t)]">
      <xsl:choose>
         <xsl:when test="name()=concat('h0',$t)">
            <xsl:element name="h0{$t}">
              <xsl:copy-of select="node()"/>
            </xsl:element>
            <!--only copy nodes from the expected level-->
            <xsl:choose>
              <xsl:when test="not(current-group()[position()>1]
                                  [starts-with(local-name(.),'h0')])">
                <!--there are no deeper levels, so copy everything up
                    until the next heading-->
                <xsl:for-each-group select="current-group()[position()>1]"
                       group-starting-with="*[starts-with(local-name(.),'h')
]">
                  <xsl:if test="position()=1">
                    <xsl:copy-of select="current-group()"/>
                  </xsl:if>
                </xsl:for-each-group>
              </xsl:when>
              <xsl:otherwise>
                <!--there are deeper levels, so go deep-->
                <xsl:call-template name="titelei">
                  <xsl:with-param name="t" select="$t+1"/>
                  <xsl:with-param name="nodes"
                    select="current-group()[position()!=1]"/>
                </xsl:call-template>
              </xsl:otherwise>
            </xsl:choose>
         </xsl:when>
      </xsl:choose>
   </xsl:for-each-group>
</xsl:template>

<xsl:template name="inhalt">
   <xsl:param name="i" select="1"/>
   <xsl:param name="nodes" select="*"/>
   <!--group according to the expected level-->
   <xsl:for-each-group select="$nodes"
                       group-starting-with="*[name()=concat('h',$i)]">
      <xsl:choose>
         <xsl:when test="name()=concat('h',$i)">
            <xsl:element name="Ebene{$i}">
               <xsl:element name="h{$i}">
                 <xsl:copy-of select="node()"/>
               </xsl:element>
               <!--only copy nodes from the expected level up
                    until the next heading-->
               <xsl:for-each-group select="current-group()[position()>1]"
                 group-starting-with="*[starts-with(local-name(.),'h')]">
                 <xsl:if test="position()=1">
                   <xsl:copy-of select="current-group()"/>
                 </xsl:if>
               </xsl:for-each-group>
               <xsl:if test="current-group()[position()>1]
                                            [starts-with(local-name(.),'h')]
">
                 <!--there are deeper levels, so go deep-->
                 <xsl:call-template name="inhalt">
                   <xsl:with-param name="i" select="$i+1"/>
                   <xsl:with-param name="nodes"
                     select="current-group()[position()!=1]"/>
                 </xsl:call-template>
               </xsl:if>
            </xsl:element>
         </xsl:when>
      </xsl:choose>
   </xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
t:\ftemp>call xslt2 andreas.xml andreas.xsl andreas-out.xml

t:\ftemp>type andreas-out.xml
<?xml version="1.0" encoding="UTF-8"?>
<Teil>
   <Titelei>
      <h01>Evangelium, afrikanisches Volkstum und geistiger Volksbesitz im
Denken des Missionars
Johannes Ittmann</h01>
      <h02>bis zum ersten groen
<name_geo>Jamaika</name_geo>-Manuskript (ca.
1943) im Zusammenhang
der deutschen missionstheologischen Debatte 19091940</h02>
      <h03>Magisterschrift</h03>
      <p>zum Erwerb des Mag. theol.</p>
      <p>nach der Ordnung der</p>
      <bildunterschrift>
         <p>Johannes Ittmann (18851963)</p>
      </bildunterschrift>
   </Titelei>
   <inhalt>
      <Ebene1>
         <h1>1. Einleitung</h1>
         <h2>1.1 Gott kommt frAOher als der
Missionar</h2>
         <p>Gott kommt frAOher als der
Missionar so titelt ein Buch des
Befreiungstheologen Leonardo
Boff (1992). ...</p>
         <p_e>Ittmann steht im Kontext der deutschen Missionstheologie
seiner
Zeit, die davon ausgeht,
da das Volkstum
 ...</p_e>
         <Ebene2>
            <h2>1.1 Gott kommt frAOher als der
Missionar</h2>
            <p>Gott kommt frAOher als der
Missionar so titelt ein Buch des
Befreiungstheologen Leonardo
Boff (1992). ...</p>
            <p_e>Ittmann steht im Kontext der
deutschen Missionstheologie seiner
Zeit, die davon ausgeht,
da das Volkstum
 ...</p_e>
         </Ebene2>
         <Ebene2>
            <h2>1.2 Leben und Werk Ittmanns im berblick<fn>Die
biographischen Daten
beruhen auf einem
Nachruf zu Ittmann (KA?hler-Meyer 1964), ...</fn>
            </h2>
            <p>Ittmann schilderte mitunter, wie er selbst whrend der Reise
auf
FuArschen seine
afrikanischen Begleiter befragte. ...</p>
         </Ebene2>
         <Ebene2>
            <h2>1.3 Quellenlage, Eingrenzung, Aufbau und Methodik</h2>
            <p>Aus Ittmanns reichhaltigem
Schaffen galt es inhaltlich auszuwhlen
...</p>
         </Ebene2>
      </Ebene1>
      <Ebene1>
         <h1>2. Gott kommt frAOher als der
Missionar Inwiefern?</h1>
         <h2>2.1 Einleitendes</h2>
         <p>Gott kommt frAOher als der
Missionar  so habe ich mit Leonardo
Boff
in der Einleitung
Ittmanns...</p>
         <Ebene2>
            <h2>2.1 Einleitendes</h2>
            <p>Gott kommt frAOher als der
Missionar  so habe ich mit Leonardo
Boff
in der Einleitung
Ittmanns...</p>
            <Ebene3>
               <h3>2.1.1 Grobgestalt</h3>
               <p>Die etwa 200 Seiten des
Manuskriptes gliedern sich in eine Einleitung
von sechs Seiten und
vier Hauptteile:</p>
            </Ebene3>
            <Ebene3>
               <h3>2.1.2 Ziele und Zielgruppen</h3>
               <p>In der EinfAOhrung {I-VI}
nennt Ittmann fAOnf Zielgruppen und
entsprechende Ziele:</p>
            </Ebene3>
            <Ebene3>
               <h3>2.1.3 Methodenreflexion</h3>
               <p>Gerade der letzte Punkt
fordert ihn zur Klarlegung seiner Methode:
...</p>
               <Ebene4>
                  <h4>Zu B. Leibesleben zwischen Geburt und Tod {14-24}</h4>
                  <p>Hier kommen beide zunA?chst
auf die Beschneidung zu sprechen.
Johanssen (1931, 199-201)
...</p>
               </Ebene4>
            </Ebene3>
         </Ebene2>
      </Ebene1>
   </inhalt>
</Teil>
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