2009-04-05 12 views
13
fragmento de XML

:Seleccionar nodos secundarios en función de sus contenidos

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

¿Cómo seleccionar todos los nodos secundarios del <AA> que tienen bar como su contenido? En el ejemplo anterior, me gustaría seleccionar <CC> y <EE>. Estoy pensando que la solución es algo así como:

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

Respuesta

27

Una de las soluciones más simples a la pregunta de la OP es la siguiente expresión XPath:

*/*[.='bar'] 

hacer la nota, que ninguna instrucción XSLT es involucrado - esto es solo una expresión XPath, por lo que la pregunta solo podría etiquetarse XPath.

A partir de ahora, se podría usar esta expresión XPath en XSLT de varias maneras, como aplicar plantillas sobre todos los nodos seleccionados.

Por ejemplo, a continuación es una transformación XSLT que lleva el documento XML y produce otra, en la que todos los elementos - los niños de <AA> cuyo contenido no es igual a "bar" se suprimen:

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

Cuando esto transformación se aplica en el documento XML original:

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

el resultado deseado se produce :

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

hacer la nota:

En un modelo de partido que normalmente no es necesario especificar una expresión XPath absoluta, pero sólo uno relativo, por lo que la expresión XPath completo se simplifica de forma natural para este partido patrón:

*[. = 'bar'] 
+1

Gracias! Tu otra publicación también fue útil, ya que la siguiente extensión usaría expresiones regulares para la selección: http://stackoverflow.com/questions/539781/xpath-search-based-on-dynamic-regular-expressions – krasnaya

+0

@zhen De nada. Solo tenga en cuenta que la solución RegEx está en XPath 2.0. No existe una forma conveniente de hacerlo en XPath 1.0. –

Cuestiones relacionadas