Hallo,
ich bräuchte mal Hilfe bei einem XPath Statement:
Ich bekomme aus einem CMS eine XML-Struktur, die mit XSLT in einen HTML-Seite
umgewandelt wird. Dabei muss ich an einer Stelle wissen, ob das aktuelle Element ein
vorheriges Geschwisterelement hat, und in diesem Geschwisterelement ein Unterelement leer ist, oder nicht.
Hier das Beispiel konkreter:
XML:
Beim Transformieren muss ich wissen ob vor einem HTMLList Element ein Paragraph Element steht,
welches eine leeres Longtext Element hat. In einem solchen Fall möchte ich in ein anderes "match"-Template für die HTMLListe "verzweigen"
(über mode="..."), um die andere Visualität der HTHMListe zu realisieren.
Mein XSLT schaut grob so aus:
Ich denke so kann ich das machen, nur ist mein Problem das ich Schwierigkeiten bei
der richtigen Formulierung des XPath Statements habe, der dort stehen muss, wo die ? stehen.
Ich habe schon folgendes probiert:
Eine andere Idee, die ich hatte: Man könnte auch in XPath ein passendes "match" aufzubauen,
der mir ein passendes Node-set zurück liefert. Aber auch da komme ich nicht weiter. Ich habe zu viele Knoten, oder gar keine.
Ist es überhaupt möglich von einem Element auf das vorherige Element zu schauen und dort ein Unterelement zu prüfen, wie in diesem Fall?
Danke im Vorraus für Eure Hilfe.
Gruss Level6
ich bräuchte mal Hilfe bei einem XPath Statement:
Ich bekomme aus einem CMS eine XML-Struktur, die mit XSLT in einen HTML-Seite
umgewandelt wird. Dabei muss ich an einer Stelle wissen, ob das aktuelle Element ein
vorheriges Geschwisterelement hat, und in diesem Geschwisterelement ein Unterelement leer ist, oder nicht.
Hier das Beispiel konkreter:
XML:
Code:
<elements>
<Paragraph>
<Headline>Headline P1</Headline>
<Longtext>Longtext 1</Longtext>
</Paragraph>
<Paragraph>
<Headline>Headline P2</Headline>
<Longtext></Longtext>
</Paragraph>
<HTMLList>
<HTMLListItem EnumLevel="1">
<Longtext>HTML List ohne Longtext im P darueber</Longtext>
</HTMLListItem>
<HTMLListItem EnumLevel="1">
<Longtext>Punkt 1</Longtext>
</HTMLListItem>
<HTMLListItem EnumLevel="1">
<Longtext>Punkt 2</Longtext>
</HTMLListItem>
</HTMLList>
<Paragraph>
<Headline>Headline p3</Headline>
<Longtext>Longtext</Longtext>
</Paragraph>
<HTMLList>
<HTMLListItem EnumLevel="1">
<Longtext>HTML List mit Longtext im P darueber</Longtext>
</HTMLListItem>
<HTMLListItem EnumLevel="1">
<Longtext>Punkt 1</Longtext>
</HTMLListItem>
<HTMLListItem EnumLevel="1">
<Longtext>Punkt 2</Longtext>
</HTMLListItem>
</HTMLList>
<HTMLList>
<HTMLListItem EnumLevel="1">
<Longtext>3 Liste </Longtext>
</HTMLListItem>
<HTMLListItem EnumLevel="1">
<Longtext>Punkt 1</Longtext>
</HTMLListItem>
<HTMLListItem EnumLevel="1">
<Longtext>Punkt 2</Longtext>
</HTMLListItem>
</HTMLList>
</elements>
welches eine leeres Longtext Element hat. In einem solchen Fall möchte ich in ein anderes "match"-Template für die HTMLListe "verzweigen"
(über mode="..."), um die andere Visualität der HTHMListe zu realisieren.
Mein XSLT schaut grob so aus:
Code:
<xsl:template match="/">
<xsl:apply-templates select="elements" />
</xsl:template>
<xsl:template match="elements">
<xsl:apply-templates select="Paragraph" />
<xsl:choose>
<xsl:when test=" ? ">
<xsl:apply-templates select="HTMLList" mode="1"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="HTMLList" mode="2"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="Paragraph">
Paragraph
</xsl:template>
<xsl:template match="HTMLList" mode="1">
HTML List - vorher kein Longtext
</xsl:template>
<xsl:template match="HTMLList" mode="2">
HTML List Standard
</xsl:template>
</xsl:stylesheet>
der richtigen Formulierung des XPath Statements habe, der dort stehen muss, wo die ? stehen.
Ich habe schon folgendes probiert:
Code:
<xsl:when test="string-length(//HTMLList/preceding-sibling::Paragraph/Longtext) < 1">
der mir ein passendes Node-set zurück liefert. Aber auch da komme ich nicht weiter. Ich habe zu viele Knoten, oder gar keine.
Ist es überhaupt möglich von einem Element auf das vorherige Element zu schauen und dort ein Unterelement zu prüfen, wie in diesem Fall?
Danke im Vorraus für Eure Hilfe.
Gruss Level6