Question

extrait XML:

<AA>
  <BB>foo</BB>
  <CC>bar</CC>
  <DD>baz</DD>
  <EE>bar</EE>
</AA>

Comment puis-je sélectionner tous les nœuds enfants de <AA> qui ont bar que son contenu? Dans l'exemple ci-dessus, je veux choisir <CC> et <EE>. Je pense que la solution est quelque chose comme:

<xsl:template match="AA">
  <xsl:for-each select="???" />
</xsl:template>
Était-ce utile?

La solution

L'une des solutions les plus simples à la question de l'OP est l'expression XPath suivante :

*/*[.='bar']

Prenez note, qu'aucune instruction XSLT est impliqué -. Ceci est juste une expression XPath , la question ne pouvait être étiqueté XPath

A partir de là, on pourrait utiliser cette expression XPath dans XSLT de diverses manières, par exemple pour appliquer des modèles sur tous les noeuds sélectionnés .

Par exemple, ci-dessous est une transformation XSLT qui prend le document XML et produit un autre, où tous les éléments - les enfants de <AA> dont le contenu n'est pas égal à "bar" sont supprimés:

<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>

Lorsque cette transformation est appliquée sur le document XML original :

<AA>
    <BB>foo</BB>
    <CC>bar</CC>
    <DD>baz</DD>
    <EE>bar</EE>
</AA>

le résultat recherché est produit :

<AA>
   <CC>bar</CC>
   <EE>bar</EE>
</AA>

Prenez note :

Dans un schéma de match, nous ne avons pas besoin généralement de spécifier une expression XPath absolue, mais juste un parent, de sorte que la pleine expression XPath est naturellement simplifié à ce schéma de correspondance:

*[. = 'bar']
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top