2009-05-26 15 views
70

Avere un documento XML come questo:corrispondenza di un nodo in base al valore di un fratello 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> 

Come abbinare tutti i/record/registrazione/nome avendo come fratello/record/registrazione/Record- digitare con il valore "A"?

risposta

96

trovato:

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

È [più semplice e chiaro] (http://stackoverflow.com/a/31118801/290085) testare 'record' prima di scendere a' name'. – kjhughes

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

È inoltre possibile filtrare un elemento padre per i suoi figli:

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

+3

È [più semplice e chiaro] (http://stackoverflow.com/a/31118801/290085) per testare 'record-type' direttamente senza un predicato aggiuntivo. – kjhughes

31

Sorprendentemente, nessuna delle risposte fino ad oggi in questa vecchia questione fornire la soluzione XPath più semplice con lo.

Questo semplice XPath

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

seleziona

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

come richiesto.

Problemi correlati