Kardeş düğümün belirli bir değeri varsa, XPath kullanarak bir düğüm nasıl seçilir?


89

Aşağıdaki belgeye sahibim:

<a>
  <bb>abc</bb>
  <cc>ccc</cc>
  <dd>ddd</dd>
</a>
<a>
  <bb>zz</bb>
  <cc>1</cc>
  <dd>2</dd>
</a>

Nasıl değerini alabilirsiniz <cc>eğer XPath kullanarak <bb>olduğunu zz?


1
sorun, belirli bir düğüme nasıl erişileceğini bilmem, ancak bir kardeşin belirli bir değere sahip olması durumunda bir düğüme erişme konusunda hiçbir fikrim yok. Bunun gibi bir şey olabilir mi / a / cc / contains (/ a / bb = 'zz')?
HOE SENGKIANG

Yanıtlar:


101

Neden herkesin kardeşleri sorguladığından emin değilsiniz, aynı zamanda 's yüklemindeki <bb/>yüklemle eşleşen -elementleri de kontrol edebilirsiniz <a/>:

//a[bb/text() = "zz"]/cc/text()

24
"Neden herkesin kardeşleri sorguladığından emin değilim" : Belki de soru kardeş
içindi

4
Görünüşe göre başlığı gerçekten okumadım. :) Cevap yine de geçerli.
Jens Erat

2
Kardeşler için de cevap sorularınız. Sadece *-siblingeksen kullanmadın . +1 olsa da.
LarsH

Bu soruya cevap vermiyor ama kötü formüle ettiğim asıl sorumu cevaplıyor. Teşekkür ederim!
Kullanıcı9213


23

S: Kardeş düğüm belirli bir değere sahipse, XPath kullanarak bir düğüm nasıl seçilir?
Sonraki kardeşler ve önceki kardeşler için yalnızca "XPath Eksenleri" olduğundan, konum sabitse bunlardan birini kullanabilirsiniz.

Ama daha iyi: için bak ccebeveyn vardı çocuk sahibi bbdeğerle 'zz':

//cc[../bb='zz']

6
Ya öyle ya da //a[bb = 'zz']/cc.
Tomalak

"Aşağıdaki kardeş ve önceki-kardeş için yalnızca" XPath Eksenleri "ile ne demek istediğinizden emin değilim. Tüm kardeşler için tek bir eksen olmadığından mı bahsediyorsunuz?
LarsH

. @LarsH: Evet üzgünüm, (benim kötü İngilizce :-( mazur) - Söylemeye çalıştığım buydu (soru kardeşleri için ondan.)
hr_117

6

Öncelikle, örneğiniz iyi biçimlendirilmiş XML değildir. Bunu göz ardı ederek ve niyetlerinizi çok iyi tanımlamadığınıza göre (Hangi durumda tam olarak neyi seçmek istiyorsunuz?), Bunu yapmak istediğinizi varsayıyorum:

//cc[preceding-sibling::bb[text()="zz"]]/text()

Seçer

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

Ayrıca yazabilirsin

//bb[text()="zz"]/following-sibling::cc/text()

Lütfen spesifikasyona bakın , çok şey öğreneceğiniz çok iyi okunabilir bazı örnekler var.


1
@LarsH "Geçerli değil" den "iyi biçimlendirilmemiş" e doğru düzeltme için teşekkürler. Bugün yeni bir şey öğrendim.
Petr Janeček

4
//a/cc[../bb='zz']/text()

// a: Nerede olursa olsun tüm 'a' öğelerini seçer.

// a / cc: 'a' öğesinin alt öğesi olan 'cc' öğelerini seçer (a nerede olursa olsun).

..: Geçerli düğümün ebeveynini seçer.

[../bb='zz ']: kardeş' bb 'öğesinin değeri zz'dir.

Referans: http://www.w3schools.com/xsl/xpath_syntax.asp


4

Bu problem için başka bir çözüm ise

//bb[contains(.,'zz')]/../cc/text()

Açıklama : Tüm çocuk düğümlerinde dizge bbiçeren herhangi bir şey, daha sonra bunu kullanarak ebeveyn düğümüne gitmiş , şimdi bu şekilde dönen metne erişebiliyoruz .'zz'bbbb..cc

Umarım bu açıklama karmaşık değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.