nós Select criança com base em seu conteúdo
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>
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 ??strong>:
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']