2012-06-02 19 views
27

के बीच सभी तत्वों का चयन मैं एक निम्न xml है:XPath दो विशिष्ट तत्वों

<doc> 
    <divider /> 
    <p>text</p> 
    <p>text</p> 
    <p>text</p> 
    <p>text</p> 
    <p>text</p> 
    <divider /> 
    <p>text</p> 
    <p>text</p> 
    <divider /> 
    <p>text</p> 
    <divider /> 
</doc> 

मैं विभक्त तत्व की अगली आवृत्ति तक पहले विभक्त तत्व के बाद सभी पी नोड्स का चयन करना चाहते। मैंने निम्नलिखित xpath के साथ प्रयास किया:

//divider[1]/following-sibling::p[following::divider] 

लेकिन समस्या यह है कि यह अंतिम विभाजक तत्व से पहले सभी पी तत्वों का चयन करता है। मैं कैसे xpath 1.

उत्तर

24

bytebuster के रूप में एक ही अवधारणा है, लेकिन एक अलग xpath:

/*/divider[$k] 
    /following-sibling::p 
     [count(.|/*/divider[$k+1]/preceding-sibling::p) 
     = 
     count(/*/divider[$k+1]/preceding-sibling::p) 
     ] 

आप तो 1 साथ $k स्थानापन्न वास्तव में तो चाहता था:

/*/p[count(preceding-sibling::divider)=1] 
+0

शानदार विचार! 'गिनती 'अधिक मूर्खतापूर्ण है क्योंकि' 1' केवल एक बार उपयोग किया जाता है। – bytebuster

4

का उपयोग कर यह करने के लिए वास्तव में होने एक तत्व dividerpreceding-sibling के रूप में सभी p चुनने के बारे में क्या यकीन नहीं है?

//doc/p[preceding-sibling::divider[1] and not (preceding-sibling::divider[2])] 
14

यहाँ एक सामान्य XPath अभिव्यक्ति है p नोड्स का चयन किया जाता है।

आप 2 और 3 divider ..., आदि के बीच 2 तो सभी p तत्वों

स्पष्टीकरण साथ $k स्थानापन्न यदि:

यह Kayessian XPath का एक सरल अनुप्रयोग है नोड-सेट चौराहे के लिए 1.0 सूत्र:

$ns1[count(.|$ns2) = count($ns2)] 

से दोनों नोड्ससेट $ns1 और $ns2 पर सभी नोड्स को लेक्ट करता है।

इस विशिष्ट मामले में हम साथ $ns1 स्थानापन्न:

/*/divider[$k]/following-sibling::p 

और हम साथ $ns2 स्थानापन्न:

/*/divider[$k+1]/preceding-sibling::p 
+0

+1 'Kayessian विधि'' का अच्छा कार्यान्वयन। – Cylian

+0

@Cylian: आपका स्वागत है। –

4

मुझे लगता है कि वहाँ एक बहुत सरल और शायद तेजी से समाधान: आप में से सभी पूर्ववर्ती भाई बहन चाहते हैं दूसरा विभक्त जो कम से कम एक पूर्ववर्ती भाई विभक्त है:

/doc/divider[2]/preceding-sibling::p[preceding-sibling::divider] 

यह थोड़ा और जटिल हो जाता है, बेशक, यदि आप दूसरे और तीसरे डिवाइडर के बीच पैरा ढूंढना चाहते हैं: तो आप डैनियल हैली के समाधान की तरह कुछ और चाहते हैं।

संबंधित मुद्दे