call-template problem?
Flocke
- xsl
hallo,
ich habe ein problem mit folgender XSL:
...
<xsl:template name="group">
<xsl:param name="l" select="1"/>
<xsl:param name="nodes" select="*"/>
<xsl:for-each-group select="$nodes" group-starting-with="*[name()=concat('h',$l)]">
xsl:choose
<xsl:when test="name()=concat('h',$l)">
<xsl:element name="{if($l=1)then 'chapter' else 'section'}">
<title>
xsl:apply-templates/
</title>
<xsl:call-template name="group">
<xsl:with-param name="l" select="$l+1"/>
<xsl:with-param name="nodes" select="current-group()[position()!=1]"/>
</xsl:call-template>
</xsl:element>
</xsl:when>
xsl:otherwise
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:template>
...(folgend die anweisungen für andere tags)...
Es soll ein einfacher HTML Text mit h1 bis h7 und etlichen anderen Tags in ein docbook transformiert werden. aufbau ist:
<book>
<part>
<chapter><title>hier alle h1</title></chapter>
<section><title>hier die h2</title></section>
...
</part>
</book>
wobei die section's rekursiv in einander verschachtelt sind für die restlichen h's. das klappt auch soweit, nur liegen die verarbeiteten Knoten wie h1 und deren kinder etc. doppelt vor. ein beispiel:
...
<chapter>
<title>hier steht die erste Überschrift</title>
hier steht die erste Überschrift
...
</chapter>
ich hab schon rumprobiert und bin nun der meinung, dass es an der call-template anweisung liegt. liege ich hier richtig und wenn ja, hat jemand eine anregung, wie man den fehler behebt? ich hab nämlich das problem, dass eine transformation bei kleinen probedateien funktioniert, aber bei großen schmiert immer als ab.
mfg flocke
Hallo Flocke,
ich hab schon rumprobiert und bin nun der meinung, dass es an der call-template anweisung liegt. liege ich hier richtig und wenn ja, hat jemand eine anregung, wie man den fehler behebt?
Stelle mal "Problemdokumente" und ein testfähiges Stylesheet bereit.
Ansonsten gibt es bereits Lösungen wie Html2DocBook.
Grüße,
Thomas
hallo thomas,
hier noch der anfang des stylesheets:
<xsl:template match="/">
<book>
<bookinfo/>
<title/>
<xsl:apply-templates select="//Textabschnitt"/>
</book>
</xsl:template>
<xsl:template match="//Textabschnitt">
<part>
<xsl:call-template name="group"/>
</part>
</xsl:template>
dann die erste anweisung oben und zur verarbeitung einzelner elmente, z.b.
<xsl:template match="//Buchtitel">
<title>
xsl:apply-templates/
</title>
</xsl:template>
<xsl:template match="note">
xsl:copy
xsl:apply-templates/
</xsl:copy>
</xsl:template>
<xsl:template match="p_e">
<para>
xsl:apply-templates/
</para>
</xsl:template>
-------------------------
das ausgangsdokument wäre in folgender form:
<Root>
<Textabschnitt>
<Buchtitel>hier dann der buchtitel, der zu >part< title wird</Buchtitel>
<h1>hier die erste headline</h1>
<p_e>irgendwelcher Text</p_e>
<h2>2te headline, welche zu >section< title wird</h2>
<p_e>weiteres</p_e>
<note>Notizen</note>
<h3>wird auch zur section, wie die folgenden auch bis h7 auch</h3>
<p_e>nochmal text</p_e>
<h4>4te headline</h4>
<h2>die zweite headline im part</h2>
<h1>ein neues chapter</h1>
...
</Textabschnitt>
</Root>
Ja, das is es. Wie gesagt, die Verschachtelung fkt., aber die headlines stehen immer doppelt da.
ich bin offen für hilfe
mfg flocke
Hallo Flocke,
Wie gesagt, die Verschachtelung fkt., aber die headlines stehen immer doppelt da.
Kann ich mit Saxon 9.0B nicht nachvollziehen:
<?xml version="1.0" encoding="UTF-8"?>
<book>
<bookinfo/>
<title/>
<part>
<title>hier dann der buchtitel, der zu >part< title wird</title>
<chapter>
<title>hier die erste headline</title>
<para>irgendwelcher Text</para>
<section>
<title>2te headline, welche zu >section< title wird</title>
<para>weiteres</para>
<note>Notizen</note>
<section>
<title>wird auch zur section, wie die folgenden auch bis h7 auch</title>
<para>nochmal text</para>
<section>
<title>4te headline</title>
</section>
</section>
</section>
<section>
<title>die zweite headline im part</title>
</section>
</chapter>
<chapter>
<title>ein neues chapter</title>
</chapter>
</part>
</book>
Grüße,
Thomas
Hallo Thomas,
ich habs gerade mit sexon durchgespielt und es funktioniert. hatte mir gestern abend schon gedacht, dass es eventuell am parser liegt und es war auch wirklich so. meinen langen text rödelt er wie nichts durch.
in diesem sinne bedanke ich mich für deine hilfe thomas.
mfg Flocke