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>
War es hilfreich?

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']
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top