Pergunta

XML trecho:

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

Como faço para selecionar todos os nós da criança de <AA> que têm bar como o seu conteúdo? No exemplo acima, eu gostaria de selecionar <CC> e <EE>. Estou pensando a solução é algo como:

<xsl:template match="AA">
  <xsl:for-each select="???" />
</xsl:template>
Foi útil?

Solução

Uma das soluções mais simples para a pergunta do OP é a seguinte expressão XPath :

*/*[.='bar']

Do nota, que nenhuma instrução XSLT está envolvido -. Esta é apenas uma expressão XPath , então a questão só poderia ser marcado XPath

A partir daí, pode-se usar esta expressão XPath em XSLT de várias maneiras, tais como aplicar modelos sobre todos nós selecionados .

Por exemplo, a seguir é uma transformação XSLT que leva o documento XML e produz um outro, no qual todos os elementos - filhos de <AA> cujo conteúdo não é igual a "bar" são excluídos:

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

Quando esta transformação é aplicada no documento XML original :

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

o resultado queria é produzido :

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

Do nota :

Em um padrão de jogo que normalmente não precisa especificar uma expressão XPath absoluta, mas apenas um parente, então a expressão XPath completo é naturalmente simplificado para este padrão de jogo:

*[. = 'bar']
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top