XML 2 Docbook
Orlanski
- xsl
0 montero
Hallo,
ich brauche bitte hilfe bei der transformation einer xml datei zu einer docbook-xml.
die input-xml ist wie folgt aufgebaut:
<Textabschnitt>
<h1>Titel des Buches</h1>
...
<h1>Titel des ersten Kapitels</h1>
...
<h2>Titel des ersten Unterkapitels</h2>
usw...
<h7>Titel des Unterkapitels</h7>
....
</Textabschnitt>
Als Ergebnis soll dann folgendes vorliegen:
(wenn ich das richtig verstanden habe)
<set>
<book>
<bookinfo>
<title>Der Titel der ersten h1 soll hier stehen<title>
</bookinfo>
<part>
<title>die zweite h1 als Überschrift des ersten Teils</title>
...
<chapter>
<title>die h2 Überschriften</title>
...
<sect1>
<title>hier die h3</title>
...(bis h7, wobei diese dann sect5 ist)
</sect1>
</chapter>
</part>
</book>
</set>
Bei ... kann generell alles stehen, sowohl in der ausgangsdatei und der ziel-docbook.
ich wäre dankbar für anregungen, gerade was die verarbeitung der ersten h1 betrifft - hatte das mit einer <choose> Abfrage gemacht, aber das hatte nich so recht geklappt.
--------------------------------------
ich habe hier eine xsl, die ähnlich ist, d.h. im endeffekt nur ein bisschen umgeschrieben werden muss, weil in dieser die erste h1 und erste h2 anders verarbeitet werden (d.h. nicht so, wie ich das gern hätte). Leider finde ich keinen ansatzpunkt:
...
<xsl:template match="/">
<set>
<book>
<bookinfo/>
xsl:apply-templates/
</book>
</set>
</xsl:template>
<xsl:template match="Textabschnitt">
<xsl:apply-templates select="h1 | h2[1]"/>
</xsl:template>
<xsl:template match="h1">
<title>xsl:apply-templates/</title>
</xsl:template>
<xsl:template match="h2">
<chapter>
<title>xsl:apply-templates/</title>
<para>
<xsl:for-each-group select="following-sibling::*"
group-starting-with="h2|h3|h4">
<xsl:if test="position()=1">
<xsl:copy-of select="current-group()[self::p]/node()"/>
</xsl:if>
</xsl:for-each-group>
</para>
<xsl:for-each-group select=". | following-sibling::*"
group-starting-with="h2|h3|h4">
<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">
<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">
</xsl:when>
xsl:otherwise
<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>
Hallo,
ich brauche bitte hilfe bei der transformation einer xml datei zu einer docbook-xml.
die input-xml ist wie folgt aufgebaut:
<Textabschnitt>
<h1>Titel des Buches</h1>
...
<h1>Titel des ersten Kapitels</h1>
...
<h2>Titel des ersten Unterkapitels</h2>
usw...
<h7>Titel des Unterkapitels</h7>
....
</Textabschnitt>Als Ergebnis soll dann folgendes vorliegen:
(wenn ich das richtig verstanden habe)<set>
<book>
<bookinfo>
<title>Der Titel der ersten h1 soll hier stehen<title>
</bookinfo>
<part>
<title>die zweite h1 als Überschrift des ersten Teils</title>
...
<chapter>
<title>die h2 Überschriften</title>
...
<sect1>
<title>hier die h3</title>
...(bis h7, wobei diese dann sect5 ist)
</sect1>
</chapter>
</part>
</book>
</set>Bei ... kann generell alles stehen, sowohl in der ausgangsdatei und der ziel-docbook.
ich wäre dankbar für anregungen, gerade was die verarbeitung der ersten h1 betrifft - hatte das mit einer <choose> Abfrage gemacht, aber das hatte nich so recht geklappt.
ich habe hier eine xsl, die ähnlich ist, d.h. im endeffekt nur ein bisschen umgeschrieben werden muss, weil in dieser die erste h1 und erste h2 anders verarbeitet werden (d.h. nicht so, wie ich das gern hätte). Leider finde ich keinen ansatzpunkt:
...
<xsl:template match="/">
<set>
<book>
<bookinfo/>
xsl:apply-templates/
</book>
</set>
</xsl:template><xsl:template match="Textabschnitt">
<xsl:apply-templates select="h1 | h2[1]"/>
</xsl:template><xsl:template match="h1">
<title>xsl:apply-templates/</title>
</xsl:template><xsl:template match="h2">
<chapter>
<title>xsl:apply-templates/</title>
<para>
<xsl:for-each-group select="following-sibling::*"
group-starting-with="h2|h3|h4">
<xsl:if test="position()=1">
<xsl:copy-of select="current-group()[self::p]/node()"/>
</xsl:if>
</xsl:for-each-group>
</para>
<xsl:for-each-group select=". | following-sibling::*"
group-starting-with="h2|h3|h4">
<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">
<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">
</xsl:when>
xsl:otherwise
<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>