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 Mensch ? ein 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>
--~--