2011-01-19 14 views
12

मैं नोड्स के भीतर एक स्ट्रिंग के लिए खोज करने के लिए एक रास्ता खोजने की कोशिश कर रहा हूँ, लेकिन उन नोड्स में से कुछ उसके उप-तत्व की ythe सामग्री को छोड़कर की अनदेखी सामग्री पाते हैं। सादा और सरल, मैं एक पाठ के अनुच्छेदों में एक स्ट्रिंग की खोज करना चाहता हूं, जो फुटनोट को छोड़कर पैराग्राफ के बच्चे तत्व हैं।XPath/XQuery: एक नोड में पाठ है, लेकिन विशिष्ट वंशज तत्वों

उदाहरण के लिए,

मेरे दस्तावेज़ किया जा रहा है:

<document> 
    <p n="1">My text starts here/</p> 
    <p n="2">Then it goes on there<footnote>It's not a very long text!</footnote></p> 
</document> 

जब मैं "पाठ" के लिए खोज कर रहा हूँ, मैं Xpath/XQuery चाहते पहले पी तत्व को पुनः प्राप्त करने जाएगा, लेकिन नहीं एक दूसरे (जहां "पाठ" केवल फुटनोट उपखंड में निहित है)।

मैं समारोह की कोशिश की है, लेकिन यह दोनों पी तत्वों प्राप्त करता है।

किसी भी मदद की बहुत सराहना की जाएगी :)

+0

अच्छा सवाल है, +1। एक संक्षिप्त और आसान XPath 1.0 अभिव्यक्ति के लिए मेरा उत्तर देखें जो वांछित टेक्स्ट-नोड्स को और अधिक जटिल XML दस्तावेज़ों में भी चुनता है। :) –

उत्तर

14

मैं एक पाठ की पैराग्राफ में एक स्ट्रिंग के लिए खोज करने के लिए, फ़ुटनोट जो बच्चों तत्व हैं को छोड़कर चाहते पैराग्राफ

एक XPath 1.0 की - एकमात्र समाधान:

का उपयोग करें:

//p//text()[not(ancestor::footnote) and contains(.,'text')] 

निम्नलिखित XML दस्तावेज़ के खिलाफ (जो आपसे प्राप्त लेकिन यह अधिक दिलचस्प बनाने के एक footnote के भीतर जोड़ p ओं):

<document> 
    <p n="1">My text starts here/</p> 
    <p n="2">Then it goes on there 
     <footnote>It's not a very long text! 
      <p>text</p> 
     </footnote> 
    </p> 
</document> 

इस XPath अभिव्यक्ति वास्तव में वांछित पाठ नोड का चयन करता है:

My text starts here/ 
+0

धन्यवाद Dimitre! – Hemka

+0

@ हेम्का: आपका स्वागत है :) –

+2

+1 अच्छा XPath 1.0 उत्तर। –

1

/document/p[text()[contains(., 'text')]] करना चाहिए।

+0

धन्यवाद मार्टिन! इस के साथ एकमात्र समस्या यह है कि * सभी * उपखंडों की सामग्री को अनदेखा करते हुए, पी में 'टेक्स्ट' का चयन किया जाता है। मैं केवल फुटनोट तत्वों को अनदेखा करना चाहता हूं। – Hemka

+0

क्या आप अपने प्रश्न को कुछ और प्रतिनिधि एक्सएमएल नमूना के साथ अपडेट कर सकते हैं ताकि यह स्पष्ट हो जाए कि आवश्यकताएं क्या हैं? क्या '/ दस्तावेज़/पी [वंशज-या-स्वयं :: * [नहीं (स्वयं :: फुटनोट)]/पाठ() [शामिल है (।, 'पाठ')]] पर्याप्त है? –

4
//p[(.//text() except .//footnote//text())[contains(., 'text')]] 
+1

+1 अच्छा XPath 2.0 उत्तर। –

0

रिकॉर्ड के लिए, अन्य उत्तरों के पूरक के रूप में, मुझे यह कामकाज मिला है जो नौकरी भी लगता है:

//p[contains(child::text()|not(descendant::footnote), "text")] 
+1

यह मान्य XPath अभिव्यक्ति नहीं है। यूनियन ऑपरेटर ('|') के लिए अपने दोनों ऑपरेटरों को नोड्स की आवश्यकता होती है, लेकिन 'नहीं()' फ़ंक्शन का रिटर्न प्रकार xs है: बूलियन - किसी भी अनुपालन XPath इंजन * को एक त्रुटि उठाना चाहिए। –

+0

ओच, आप सही हैं Dimitre, ऑक्सीजन एक त्रुटि उठाई।अजीब, अभिव्यक्ति मेरी PHP लिपि में काम किया! – Hemka

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