Hallo zusammen,
ich bin absoluter Neuling hier und auch erst seit ein paar Tagen mit XSLT und XPath befasst. Mein Problem ist folgendes:
Ich habe eine XML-Datei mit der abgebildeten Struktur eines Vertragstextes.
Hier ein Ausschnitt:
Mit einer xsl-Datei will ich zunächst den Text als HTML ausgeben und darstellen. Auszug aus der xsl-Datei:
Das Problem ist, dass die Liste ein Kindelement von text ist, text aber sowohl einen String als Value haben kann als auch die Liste mit ihren Zeilen.
Der Templateaufruf "text" aus dem Template "absatz" führt dazu, dass der ganze Inhalt von "text", also ggf. auch die Listenelemente ausgegeben werden, aber nicht als Liste sondern als Fliestext. Ich lasse also mit select="contains(current(),'child::liste/zeile')" prüfen, ob das erste Listenelement im String von "text" enthalten ist. Wenn ja, möchte ich, dass nur der Teilstring vor diesem Element ausgegeben wird. Die Liste erhalte ich durch das Template "liste" in der <ul>-Formatierung.
Leider liefert contains() in meinem Fall keine korrekten Ergebnisse, denn die HTML-Darstellung zeigt, dass die Listenlemente in dem String von "text" enthalten sind.
Ich habe die choose-Abfrage auch schon anders gestaltet:
In diesem Fall bekomme ich die Liste aber keinen Text mehr, weil substring-before() einen leeren String zurück liefert.
Wo ist mein Denkfehler? Wie kann ich dieses Problem anders lösen?
Für Eure Hilfe wäre ich sehr dankbar.
Gruß
Wolfen
ich bin absoluter Neuling hier und auch erst seit ein paar Tagen mit XSLT und XPath befasst. Mein Problem ist folgendes:
Ich habe eine XML-Datei mit der abgebildeten Struktur eines Vertragstextes.
Hier ein Ausschnitt:
Code:
<paragraf> <no>§ 1</no> <bez>Gegenstand des Vertrages</bez> <absatz> <nr>(1)</nr> <text>Vertragstext Absatz 1 <liste> <zeile>Text einer Aufzähluingsliste</zeile> <zeile>Text einer Aufzähluingsliste</zeile> </liste> </text> </absatz> </paragraf>
Code:
<xsl:template match="paragraf"> <tr> <td width="670" valign="top"> <b><xsl:value-of select="no" /> <xsl:value-of select="bez" /></b> </td> </tr> <tr> <td width="670" valign="top"> <xsl:apply-templates select="absatz"/> </td> </tr> </xsl:template> <xsl:template match="absatz"> <table width="670" border="0"> <tr> <td width="67" valign="top"> <xsl:value-of select="nr" /> </td> <td width="603" valign="top"> <p> <xsl:apply-templates select="text" /> </p> </td> </tr> </table> </xsl:template> <xsl:template match="text"> <xsl:choose> <xsl:when test="contains(current(),string('child::liste/zeile'))"> <xsl:value-of select="substring-before(current(),string('child::liste/zeile'))" /> <xsl:apply-templates select="liste" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="." /> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="liste"> <ul> <xsl:for-each select="zeile"> <li><xsl:value-of select="." /></li> </xsl:for-each> </ul> </xsl:template> </xsl:stylesheet>
Der Templateaufruf "text" aus dem Template "absatz" führt dazu, dass der ganze Inhalt von "text", also ggf. auch die Listenelemente ausgegeben werden, aber nicht als Liste sondern als Fliestext. Ich lasse also mit select="contains(current(),'child::liste/zeile')" prüfen, ob das erste Listenelement im String von "text" enthalten ist. Wenn ja, möchte ich, dass nur der Teilstring vor diesem Element ausgegeben wird. Die Liste erhalte ich durch das Template "liste" in der <ul>-Formatierung.
Leider liefert contains() in meinem Fall keine korrekten Ergebnisse, denn die HTML-Darstellung zeigt, dass die Listenlemente in dem String von "text" enthalten sind.
Ich habe die choose-Abfrage auch schon anders gestaltet:
Code:
<xsl:when test="child::liste/zeile!=''"> <xsl:value-of select="substring-before(current(),string('child::liste/zeile'))" /> <xsl:apply-templates select="liste" /> </xsl:when>...
Wo ist mein Denkfehler? Wie kann ich dieses Problem anders lösen?
Für Eure Hilfe wäre ich sehr dankbar.
Gruß
Wolfen
Comment