Knoten inline ersetzen?
Mr. Horse
- xsl
Hallo,
ich habe ein XML-Dokument mit Kapiteln (chapter) vorliegen. Die Kapitel bestehen wiederum aus Absätzen, den para-Knoten. Nun gibt es aber innerhalb dieser para mitten im Text footnote-Elemente:
<para>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non nulla. In eget enim. Vivamus ac eros. Pellentesque justo urna, tempor eget
<footnote xml:id="footnote0">Hier ein Literaturhinweis</footnote>
placerat in, elit. Integer a nibh. Integer porta. Aliquam dapibus sem ut eros. Morbi a libero. Phasellus ultrices ante at risus
<footnote xml:id="footnote1">Noch ein Hinweis</footnote>
habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
</para>
Ich muss nun für die HTML-Ausgabe diese footnote-Elemente inline, also an der Stelle im Text, an der sie im XML stehen, ersetzen durch span-Elemente.
Mit apply-templates komme ich da aber nicht weit, weil damit ja alle footnote-Elemente innerhalb des betreffenden para-Knotens gleichzeitig ersetzt und ans Ende des Inhalts des Absatzes (bzw. des von mir per XSL erzeugten p-Elements) gehängt werden.
Kann es sein, dass das mit XSLT gar nicht zu machen ist, weil die vorliegende XML-Struktur so nicht vorteilhaft ist?
Oder habe ich einfach gerade ein dickes Brett vor dem Kopf?
Bin für Hinweise dankbar!
Thanx und ciao,
Andreas
Hallo,
nach einiger Sucherei habe ich diese sehr hilfreiche Seite gefunden: Utility Stylesheets.
Dort war jetzt speziell der Abschnitt „Convert Mixed Content to Element Content“ interessant für mich.
In abgewandelter Form funktioniert das in meinem Fall nun so:
...
<p><xsl:call-template name="paragraph" /></p>
...
<xsl:template match="footnote">
<span style="background:yellow;"><xsl:value-of select="./para" /></span>
</xsl:template>
<xsl:template match="para" mode="paragraph" name="paragraph">
<xsl:apply-templates select="node()" />
</xsl:template>
Das funktioniert nun zumindest so, wie ich es brauche.
Ob das nun auch eine sinnvolle und elegante Lösung ist, weiß ich nicht.
So long,
Mr Horse
Warum nicht einfach so?
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="para">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="footnote">
<span>
<xsl:apply-templates/>
</span>
</xsl:template>