Wählen Sie untergeordnete Knoten, basierend auf deren Inhalt
Frage
XML-Snippet:
<AA>
<BB>foo</BB>
<CC>bar</CC>
<DD>baz</DD>
<EE>bar</EE>
</AA>
Wie wähle ich die alle untergeordneten Knoten <AA>
, die als Inhalt bar
haben? In dem obigen Beispiel würde ich mag <CC>
und <EE>
auszuwählen. Ich denke, die Lösung ist so etwas wie:
<xsl:template match="AA">
<xsl:for-each select="???" />
</xsl:template>
Lösung
Eine der einfachsten Lösungen auf die Frage des OP ist die folgende XPath-Ausdruck :
*/*[.='bar']
Zu beachten ist, dass keine XSLT-Anweisung beteiligt ist -. Dies ist nur ein XPath-Ausdruck , so könnte die Frage nur XPath markiert werden
Von hier aus könnte man diesen XPath-Ausdruck in XSLT auf verschiedene Weise verwenden, wie Vorlagen auf allen ausgewählten Knoten anwenden .
Zum Beispiel unten ist ein XSLT-Transformation, die das XML-Dokument nimmt und einen anderen, in dem alle Elemente - Kinder von <AA>
, deren Inhalt nicht gleich "bar"
ist gestrichen:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="AA">
<xsl:copy>
<xsl:apply-templates select="*[. = 'bar']"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Wenn diese Transformation auf dem ursprünglichen XML-Dokument angewandt wird, :
<AA>
<BB>foo</BB>
<CC>bar</CC>
<DD>baz</DD>
<EE>bar</EE>
</AA>
das gewünschte Ergebnis erzeugt :
<AA>
<CC>bar</CC>
<EE>bar</EE>
</AA>
Hinweis: :
In einem Übereinstimmungsmuster wir müssen in der Regel keinen absoluten XPath-Ausdruck geben, sondern nur einen relativen, so dass der vollständige XPath-Ausdruck natürlich für dieses Spiel Muster vereinfacht wird:
*[. = 'bar']