2010-08-02 19 views
18

में पिछले और निम्न भाई के उपयोग को जोड़ना मेरे पास एक साधारण समस्या है लेकिन मैं इसे हल नहीं कर सकता। मान लीजिए कि मैं निम्नलिखित कोड डालें:उसी xpath क्वेरी

<a> 
    <b property="p1">zyx</b> 
    <b>wvu</b> 
    <b>tsr</b> 
    <b property="p2">qpo</b> 
    <b>qcs</b> 
</a> 

मैं b नोड जो एक property="p1" है और b नोड जो property="p2" है के बीच नोड्स का चयन करना चाहते। मैं पिछले कुछ भाई-बहनों और निम्न-भाई अक्ष वाले लोगों में से एक कर सकता हूं लेकिन मुझे लगता है कि दोनों को कैसे गठबंधन करना है।

+0

अच्छा प्रश्न (+1)। XPath 1.0 और XPath 2.0 में समाधान के लिए मेरा उत्तर देखें। –

उत्तर

18

XPath 1.0:

/a/b[preceding-sibling::b/@property='p1' and following-sibling::b/@property='p2'] 

XPath 2.0:
अभिव्यक्ति ऊपर XSLT 2.0 में कुछ quirks है, यह उपयोग करने के लिए बेहतर है नए और सुरक्षित ऑपरेटर << (पहले) और >> (बाद में)।

/a/b[../b[@property='p2'] << . and . >> ../b[@property='p1']] 
+0

ऐसा लगता है कि हम एक ही समय में इस बारे में सोच रहे थे। जा! –

+0

@Alejandro: हाँ, लेकिन मुझे लगता है कि "और" का उपयोग दो भविष्यवाणियों के अनुक्रम का उपयोग करने से सुरक्षित है। –

-1

आप and का उपयोग करके भविष्यवाणी में परीक्षणों को जोड़ सकते हैं।

+2

दरअसल, वर्तनी से बाहर कुछ ऐसा पढ़ा जाएगा: '// b [preceding-sibling :: b/@ property = 'p1' और निम्न-भाई :: बी/@ संपत्ति = 'पी 2']' – Wrikken

+0

विक्रकेन: ठीक है धन्यवाद आप। मुझे नहीं पता था कि मैं पहले और इस तरह के भाई का उपयोग कर सकता था, मैंने कभी इसे "बी [@ संपत्ति =" पी 1 "]/निम्नलिखित-भाई :: *" पॉल बुचर: मुझे पता था कि, लेकिन –

5

इसके अलावा, इस XPath 1.0:

/a/b[preceding-sibling::b/@property='p1'][following-sibling::b/@property='p2'] 

नोट: पहले कदम के रूप // प्रयोग न करें। जब भी आप भविष्यवाणी करके and ऑपरेटर को प्रतिस्थापित कर सकते हैं, तो इसे करें।

XPath 2.0 में:

/a/b[. >> ../b[@property='p1']][../b[@property='p2'] >> .] 
+0

का जवाब देने के लिए समय निकालने के लिए धन्यवाद, मुझे आपके उत्तर के लिए धन्यवाद, बिल्कुल मुझे क्या चाहिए। लेकिन मैं उत्सुक हूं कि आप क्यों बदलेंगे और एक और भविष्यवाणी करेंगे? –

+0

@ raph.amiard: http://www.w3.org/TR/xpath/#booleans से: "प्रत्येक ऑपरेंड का मूल्यांकन करके एक और अभिव्यक्ति का मूल्यांकन किया जाता है"। इसलिए, यदि बाएं ऑपरेंड झूठा है, तो सही ऑपरेंड का मूल्यांकन किसी भी तरह से किया जाएगा। पूर्वानुमान के साथ, केवल उन नोड्स के लिए जो पहले फ़िल्टर को पास करते हैं, दूसरी भविष्यवाणी उन पर लागू होगी। XPath 2.0 के लिए, यह मामला नहीं हो सकता है। –