2009-05-26 7 views
70

Tener un documento XML como esto:Coincidencia de un nodo basado en el valor de un hermano con XPath

<?xml version="1.0" encoding="UTF-8"?> 
<records type="array"> 
    <record> 
    <name>svn</name> 
    <record-type>A</record-type> 

    <ttl type="integer">86400</ttl> 
    <zone-id type="integer">69075</zone-id> 
    <aux type="integer">0</aux> 
    <id type="integer">xxx</id> 
    <active>Y</active> 
    <data>xxx.xxx.xxx.xxx</data> 

    </record> 
    <record> 
    <name>domain.tld.</name> 
    <record-type>NS</record-type> 

    <ttl type="integer">86400</ttl> 
    <zone-id type="integer">xxx</zone-id> 
    <aux type="integer">0</aux> 
    <id type="integer">xxx</id> 
    <active>Y</active> 
    <data>domain.tld.</data> 

    </record> 
    <record> 
    <name>blog</name> 
    <record-type>A</record-type> 
    <ttl type="integer">86400</ttl> 
    <zone-id type="integer">xxx</zone-id> 
    <aux type="integer">0</aux> 

    <id type="integer">xxx</id> 
    <active>Y</active> 
    <data>xxx.xxx.xxx.xxx</data> 
    </record> 
</records> 

Cómo hacer coincidir todos los/registros/registro/nombre teniendo como hermanos/registros/registro/RECORD- escriba con el valor "A"?

Respuesta

96

lo encontró:

/records/record/name[../record-type/text() = "A"] 
+3

Es [más simple y más claro] (http://stackoverflow.com/a/31118801/290085) para probar 'record' antes de descender a' name'. – kjhughes

-3
/records/record[record-type='A'] 
39

También puede filtrar un elemento padre por sus hijos:

/records/record[record-type[text()='A']]/name

+3

Es [más simple y más claro] (http://stackoverflow.com/a/31118801/290085) para probar 'tipo-registro' directamente sin un predicado adicional. – kjhughes

31

Sorprendentemente, ninguna de las respuestas a la fecha sobre esta cuestión de edad proporcione la solución más simple XPath.

Este sencillo XPath

/records/record[record-type = "A"]/name 

selecciona

<name>svn</name> 
<name>blog</name> 

conforme a lo solicitado.

Cuestiones relacionadas