2011-07-16 27 views
29

que tienen un documento XML que necesito que se deben eliminar piezas particulares de datosuso XPath para seleccionar elementos con un conjunto de múltiples atributos/valores

el documento XML tiene una estructura de la siguiente manera: -

<a> 
    <b select='yes please'> 
     <c d='text1' e='text11'/> 
     <c d='text2' e='text12'/> 
     <c d='text3' e='text13'/> 
     <c d='text4' e='text14'/> 
     <c d='text5' e='text15'/> 
    </b> 
</a> 
<a> 
    <b select='no thanks'> 
     <c d='text1' e='text21'/> 
     <c d='text3' e='text23'/> 
     <c d='text5' e='text25'/> 
    </b> 
</a> 
<a> 
    <b select='yes please'> 
     <c d='text1' e='text31'/> 
     <c d='text2' e='text32'/> 
     <c d='text3' e='text33'/> 
     <c d='text4' e='text34'/> 
     <c d='text5' e='text35'/> 
    </b> 
</a> 
<a> 
    <b select='no thanks'> 
     <c d='text4' e='text41'/> 
     <c d='text3' e='text43'/> 
     <c d='text5' e='text45'/> 
    </b> 
</a> 

necesito seleccionar solo aquellos/a/b grupos de elementos que tienen d attribute = 'text1' y d attribute = 'text4', una vez que he identificado estos documentos secundarios quiero obtener el valor de los atributos e con d valor de atributo 'text5'

hope tha ct claras

Saludos

DD

+0

+1 para XPath/XSLT Domingo de preguntas :) –

+7

ops, es sábado ... –

+0

@empo, en algunas zonas es el domingo ya :-) –

Respuesta

32

Puede utilizar este XPath:

//a[b/c/@d = 'text1' and b/c/@d = 'text4']/b/c[@d = 'text5']/@e 

Se seleccionará e='text15' y e='text35' de 1º y 3º a/b

XSLT:

<xsl:template match="//a[b/c/@d = 'text1' and b/c/@d = 'text4']/b/c[@d = 'text5']"> 
    <xsl:value-of select="@e"/> 
</xsl:template> 
+0

muy agradable, y gracias por su tiempo y esfuerzo – Hector

+0

@ user423199, ¡De nada! –

+0

@ user423199, puede marcar como respuesta o respuesta positiva apropiada. –

3

Se puede utilizar una sola plantilla para que coincida con el grupo requerido, y luego se obtiene el valor de los atributos requeridos:

<xsl:template match="/*/a/b[c[@d='text1'] and c[@d='text4']]"> 
    <xsl:value-of select="c[@d='text5']/@e"/> 
</xsl:template> 

asumiendo:

<root> 
    <a> 
     <b select='yes please'> 
      <c d='text1' e='text11'/> 
      <c d='text2' e='text12'/> 
      <c d='text3' e='text13'/> 
      <c d='text4' e='text14'/> 
      <c d='text5' e='text15'/> 
     </b> 
    </a> 
    <a> 
     <b select='no thanks'> 
      <c d='text1' e='text21'/> 
      <c d='text3' e='text23'/> 
      <c d='text5' e='text25'/> 
     </b> 
    </a> 
    <a> 
     <b select='yes please'> 
      <c d='text1' e='text31'/> 
      <c d='text2' e='text32'/> 
      <c d='text3' e='text33'/> 
      <c d='text4' e='text34'/> 
      <c d='text5' e='text35'/> 
     </b> 
    </a> 
    <a> 
     <b select='no thanks'> 
      <c d='text4' e='text41'/> 
      <c d='text3' e='text43'/> 
      <c d='text5' e='text45'/> 
     </b> 
    </a> 
</root> 

la salida será text15 y text35.

+0

gracias por molestarme en ver mi problema, ¡me estaba volviendo loco! Gracias por gastando tiempo en él – Hector

+0

@user, usted es bienvenido. La parte "complicada" aquí es hacer coincidir un elemento para el que tenemos al menos dos instancias de los mismos niños con diferente valor de atributo. Debe usar _and_ y, para mayor claridad, un predicado anidado . –

3

necesito seleccionar solo aquellos/a/b grupos de elementos que tienen d attribute = 'text1' yd atributo = 'text4', una vez que he identificado estos documentos secundarios quiero obtener el valor de e d atributos con atributo de valor 'text5' eso es

esperanza claras

Sí, es tan clara la traducción al XPath es casi mecánico

(: those /a/b element groups :) a/b 
(: that have d attribute = 'text1' :) [c/@d='text1'] 
(: and d attribute = 'text4' :) [c/@d='text4'] 
(: and .. i want to get the value of the e attributes 
    with d attribute value 'text5' :)/c[@d='text5']/@e 
+1

FYI- Para quienes no estén familiarizados, '(::)' son comentarios de XPath 2.0. Http://www.w3.org/TR/xpath20/#prod-xpath-Comment Si está usando XPath 1.0, elimine los comentarios y simplemente use la declaración XPath, es decir, 'a/b [c/@ d = 'text1'] [c/@ d = 'text4']/c [@ d = 'text5']/@ e' –

1

usar esta expresión XPath sola:

/*/a/b[c/@d='text1' and c/@d='text4'] 
     /c[@d='text5'] 
      /@e 
Cuestiones relacionadas