Ho il seguente documento:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
Come posso ottenere il valore <cc>
dell'utilizzo di XPath se lo <bb>
è zz
?
Ho il seguente documento:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
Come posso ottenere il valore <cc>
dell'utilizzo di XPath se lo <bb>
è zz
?
Risposte:
Non sei sicuro del motivo per cui tutti stanno interrogando i fratelli, puoi anche controllare gli <bb/>
-elementi che corrispondono al predicato dal <a/>
predicato di:
//a[bb/text() = "zz"]/cc/text()
*-sibling
asse. +1 però.
Quello che ti serve è l' following-sibling
asse XPath
//a/bb[text()="zz"]/following-sibling::cc[1]/text()
Prova Xpath qui: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625
D: Come selezionare un nodo utilizzando XPath se il nodo di pari livello ha un valore specifico?
Poiché ci sono solo "XPath Axes" per i seguenti fratelli e sorelle precedenti, puoi usarne uno se la posizione è fissa.
Ma meglio:
cerca dove cc
il genitore ha un figlio bb
con valore 'zz'
:
//cc[../bb='zz']
//a[bb = 'zz']/cc
.
Prima di tutto, il tuo esempio non è un XML ben formato. Trascurando questo e che non hai descritto molto bene i tuoi intenti (cosa vuoi selezionare esattamente a quale condizione?), Presumo che tu voglia fare questo:
//cc[preceding-sibling::bb[text()="zz"]]/text()
Seleziona
TEXT VALUES OF ALL <CC> ELEMENTS
//cc /text()
THAT HAVE A PRECEDING SIBLING <BB>
[preceding-sibling::bb ]
THAT HAS TEXT VALUE EQUAL TO "zz"
[text()="zz"]
Potresti scrivere anche come
//bb[text()="zz"]/following-sibling::cc/text()
Per favore guarda le specifiche , ha alcuni esempi molto ben leggibili dai quali imparerai molto.
//a/cc[../bb='zz']/text()
// a: seleziona tutti gli elementi "a" indipendentemente da dove si trovano.
// a / cc: seleziona gli elementi "cc" che sono figli dell'elemento "a" (indipendentemente da dove si trova a).
..: seleziona il genitore del nodo corrente.
[../bb='zz ']: dove il valore dell'elemento "bb" di pari livello è zz.
Riferimento: http://www.w3schools.com/xsl/xpath_syntax.asp
Un'altra soluzione per questo problema è
//bb[contains(.,'zz')]/../cc/text()
Spiegazione : Qualsiasi bb
che contenga una 'zz'
stringa in tutti i nodi figlio che bb
va poi al nodo genitore di quello bb
utilizzando ..
, ora che possiamo accedere alcc
testo così restituito.
Spero che la spiegazione non sia complessa.