xsl-list
[Top] [All Lists]

Re: [xsl] problem with creating structure

2007-11-12 02:04:43
Hello Michael,

I am using XSLT 2.0.

Thanks,
Andreas


On 12.11.2007 0:33 Uhr, "Michael Kay" <mike(_at_)saxonica(_dot_)com> wrote:


There is a construct in XSLT 2.0 explicitly designed for problems like this:

<xsl:for-each-group group-starting-with="h2">

It can be done in XSLT 1.0, using recursion, but requires more effort. So
the first thing to establish is, are you using XSLT 2.0 or 1.0?

Michael Kay
http://www.saxonica.com/

-----Original Message-----
From: Andreas Peter [mailto:info(_at_)minimag(_dot_)de]
Sent: 11 November 2007 21:05
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] problem with creating structure

Hello list,

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.
I have the following XSL code which generates for every <h2>
element an element <chapter>.

     <xsl:template match="Root">
         <xsl:element name="set">
             <xsl:element name="book">
                 <xsl:element name="bookinfo"/>
                 <xsl:element name="title">
                     <xsl:value-of select="/h1"/>
                 </xsl:element>
                 <xsl:apply-templates/>
             </xsl:element>
         </xsl:element>
     </xsl:template>

     <xsl:template match="h2">
         <xsl:for-each select=".">
             <xsl:if test="position() = 1">
                 <xsl:element name="chapter">
                     <xsl:element name="title">
                         <xsl:value-of select=".[position() = 1]"/>
                     </xsl:element>
                 </xsl:element>
             </xsl:if>
             <xsl:if test="position() != 1">
                 <xsl:element name="title">
                     <xsl:value-of select=".[position() != 1]"/>
                 </xsl:element>
             </xsl:if>
         </xsl:for-each>
         <xsl:apply-templates/>
     </xsl:template>

     <xsl:template match="h3">
         <xsl:for-each select=".">
             <xsl:element name="sect1">
                 <xsl:element name="title">
                     <xsl:value-of select="."/>
                 </xsl:element>
             </xsl:element>
         </xsl:for-each>
         <xsl:apply-templates/>
     </xsl:template>

     <xsl:template match="h4">
         <xsl:for-each select=".">
             <xsl:element name="sect2">
                 <xsl:element name="title">
                     <xsl:value-of select="."/>
                 </xsl:element>
                 <xsl:for-each select="Root/Textabschnitt/h4/p">
                     <xsl:element name="para">
                         <xsl:value-of select="p"/>
                     </xsl:element>
                 </xsl:for-each>
             </xsl:element>
         </xsl:for-each>
         <xsl:apply-templates/>
     </xsl:template>

Unfortunately I cannot see the problem. Any hint from the
experts? I hope this is enough code.

Thanks so much,
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>
--~--



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





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

<Prev in Thread] Current Thread [Next in Thread>