2010-10-01 17 views
12

को देखते हुए शामिल नहीं है यह:xPath: चयन पेरेंट तत्व केवल अगर बच्चे तत्व एक निश्चित मूल्य

<element_1> 
    <element_2>Text</element_2> 
    <element_3> 
     <element_4> 
      <element_5>Text with @ in Value</element_5> 
     </element_4> 
     <element_4> 
      <element_5>Test Text</element_5> 
     </element_4> 
    </element_3> 
    <element_6> 
     <element_7> 
      <element_8>0</element_8> 
... 

मैं element_1 की सभी आवृत्तियों है कि नहीं शामिल एक element_5 में '@' कैसे चुनें?

+0

अच्छा प्रश्न (+1)। सामान्य XPath अभिव्यक्ति के लिए मेरा उत्तर देखें जो किसी भी दस्तावेज़ में सभी आवश्यक तत्वों का चयन करता है - जब दस्तावेज़ की संरचना अग्रिम में ज्ञात नहीं है। –

उत्तर

14
element_1[not(contains(element_3/element_4/element_5,'@'))] 

इस रूप में

element_1[       #select elements named "element_1" 
    not(contains(     #that do not contain 
    element_3/element_4/element_5, #children in this hierarchy 
    '@'        #the character @ 
)) 
] 
+1

क्या इसे element_1 से पहले // // की आवश्यकता है? – Snekse

+0

निर्भर करता है कि क्या आप किसी भी स्तर पर element_1 से मेल खाना चाहते हैं, या यदि यह हमेशा डोम की जड़ है। – dty

+1

यह भी ध्यान रखें कि यह समाधान मानता है कि element_5 हमेशा element_4 के नीचे सीधे होता है, जो बदले में हमेशा तत्व_3 के नीचे होता है, जो बदले में हमेशा element_1 के नीचे होता है। अन्य दो समाधान मानते हैं कि element_5 तत्व_1 के नीचे किसी भी स्तर पर प्रकट हो सकता है। – dty

0
element1[not(contains(.//element_5, '@'))] 
+0

डाउनवोट के साथ क्या हो रहा है? –

6

व्याख्या की है मेरे XPath थोड़ा जंग लगी है, लेकिन कुछ इस तरह:

//element_1[.//element_5[not(contains(., "@"))]] 
+0

हम एक लिटल बिट पिक्य हैं और स्कीमा अच्छी तरह से ज्ञात होने पर '//' ऑपरेटर की अनुशंसा नहीं करते हैं ... –

+0

यह ठीक है। ओपी इसके बारे में विशिष्ट नहीं था। – dty

+1

डाउन रैंक क्यों? कम से कम एक संदेश छोड़ने की सभ्यता है कि आप नीचे रैंकिंग क्यों कर चुके हैं, जो भी हो। – dty

4

मैं के सभी उदाहरणों का चयन कैसे करूँ element_1 में element_5 में '@' नहीं है?

उपयोग:

//element_1[not(.//element_5[contains(.,'@')])] 

अंग्रेजी में, इसका मतलब: दस्तावेज़ में सभी "element_1" तत्वों है कि एक "element_5" वंशज जिसका स्ट्रिंग मान स्ट्रिंग '@' शामिल नहीं है का चयन करें।

मैं केवल // संक्षेप का उपयोग कर रहा हूं क्योंकि XML फ़ाइल की संरचना स्पष्ट नहीं है।

मैं हमेशा यह संभव होने पर // संक्षिप्त नाम का उपयोग करने से बचने की सलाह देता हूं, क्योंकि अन्यथा इसका परिणाम बहुत अक्षम एक्सपीएथ मूल्यांकन हो सकता है।

+1

@ मैड्स-हैंनसेन: संपादन के लिए धन्यवाद, लेकिन "वंशज" एक मान्य अंग्रेजी शब्द है। –

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