XPath का उपयोग करके नोड का चयन कैसे करें यदि भाई के नोड का एक विशिष्ट मूल्य है?


88

मेरे पास निम्नलिखित दस्तावेज हैं:

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

<cc>अगर <bb>मैं XPath का उपयोग करने का मूल्य कैसे प्राप्त zzकरूं?


1
समस्या यह है कि मुझे पता है कि एक विशिष्ट नोड का उपयोग कैसे किया जाता है, लेकिन यदि किसी भाई के पास विशिष्ट मूल्य है, तो मुझे नोड तक पहुंचने का कोई विचार नहीं है। क्या यह इस तरह से हो सकता है / a / cc / सम्‍मिलित है (/ / / bb = 'zz')?
HOE SENGKIANG

जवाबों:


99

यह निश्चित नहीं है कि हर कोई भाई-बहनों के लिए क्वेरी क्यों कर रहा है, आप यह भी देख सकते हैं <bb/>कि-विधेय के मिलान की भविष्यवाणी के लिए जाँच करें <a/>:

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

23
"यह निश्चित नहीं है कि हर कोई भाई-बहनों के लिए क्वेरी क्यों कर रहा है" : शायद क्योंकि सवाल भाई-बहन के लिए था; ;-)
hr_117

4
लगता है कि मैं वास्तव में शीर्षक पढ़ा नहीं था। :) उत्तर वैसे भी मान्य रहता है।
जेन्स इरट

2
भाई-बहनों के लिए आपके उत्तर प्रश्न आपने सिर्फ एक *-siblingअक्ष का उपयोग नहीं किया है। हालांकि +1।
लार्स

यह प्रश्न का उत्तर नहीं देता है लेकिन यह मेरे वास्तविक प्रश्न का उत्तर देता है जिसे मैंने बुरी तरह तैयार किया है। धन्यवाद!
User9213

37

आपको क्या चाहिए following-siblingXPath धुरी

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

यहाँ Xpath का परीक्षण करें: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625


4
@HOESENGKIANG: आपको इस उत्तर को "स्वीकार" करने के लिए चेक मार्क पर क्लिक करना चाहिए, या जो भी आपको लगता है कि प्रश्न का उत्तर सबसे अच्छा है।
लार्स

23

प्रश्न: अगर सिबलिंग नोड का एक विशिष्ट मूल्य है, तो XPath का उपयोग करके नोड का चयन कैसे करें?
क्योंकि निम्नलिखित भाई-बहनों और पूर्व-भाई-बहनों के लिए केवल "एक्सपीथ एक्सिस" हैं, यदि स्थिति ठीक हो जाती है, तो आप उनमें से एक का उपयोग कर सकते हैं।

लेकिन बेहतर: देखें ccकि क्या माता-पिता bbके मूल्य के साथ बच्चा है 'zz':

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

6
या तो वह या //a[bb = 'zz']/cc
तोमलक

यह निश्चित नहीं है कि निम्न-सहोदर और पूर्ववर्ती-सिबलिंग के लिए 'केवल "XPath Axes" से आपका क्या मतलब है।' क्या आप इस तथ्य का जिक्र कर रहे हैं कि सभी भाई-बहनों के लिए एक भी धुरी नहीं है?
लार्स

@ लार्स: हाँ क्षमा करें, (मेरी बुरी अंग्रेजी बहाना :-() - यही तो मैं कहना चाह रहा था (क्योंकि सवाल भाई बहनों का था।)
hr_117

6

सबसे पहले, आपका उदाहरण अच्छी तरह से गठित XML नहीं है। यह देखते हुए कि आपने अपने इरादों का बहुत अच्छी तरह से वर्णन नहीं किया है (आप वास्तव में किस स्थिति पर चयन करना चाहते हैं?), मुझे लगता है कि आप ऐसा करना चाहते हैं:

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

इसका चयन करता है

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

आप भी लिख सकते हैं

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

कृपया कल्पना को देखें , इसके कुछ बहुत अच्छे उदाहरण हैं , जिनसे आप बहुत कुछ सीखेंगे।


1
@ लार्स "सुधार के लिए मान्य नहीं" से "अच्छी तरह से गठित नहीं" के लिए धन्यवाद। मैंने आज कुछ नया सीखा।
पेट्र जेनेक

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

// a: सभी 'a' एलिमेंट्स का चयन करता है चाहे वह कहीं भी हो।

// a / cc: 'cc' तत्वों का चयन करता है जो 'a' तत्व (जहां कोई भी हो) के बच्चे हैं।

..: वर्तमान नोड के जनक का चयन करता है।

[../bb='zz ']: जहां' bb 'तत्व के सिबलिंग का मान zz है।

संदर्भ: http://www.w3schools.com/xsl/xpath_syntax.asp


4

इस समस्या का एक और समाधान है

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

स्पष्टीकरण : किसी भी बच्चे को उस उपयोग के मूल नोड में जाने वाले सभी बच्चे नोड्स bbमें 'zz'स्ट्रिंग होती है , अब हम उस रिटर्निंग टेक्स्ट तक पहुंच सकते हैं ।bbbb..cc

मुझे उम्मीद है कि स्पष्टीकरण जटिल नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.