2010-06-09 8 views
15

ancestor::foo[bar[@attr="val"]]XPath निकटतम पूर्वज तत्व यह है कि एक तत्व एक निश्चित मूल्य

मुझे लगा कि यह काम करेगा साथ एक विशेषता है कि शामिल है खोजने के लिए है, लेकिन यह नहीं है। मुझे पेड़ में जाने वाले निकटतम foo तत्व को खोजने की आवश्यकता है जिसमें bar बाल तत्व है, जिसके बदले attrval की विशेषता है।

+0

आपको क्या मिलता है? –

+0

कुछ भी नहीं। यह वर्णित तत्व से मेल नहीं खा रहा है। क्या अभिव्यक्ति काम करनी चाहिए? –

+8

कृपया, (न्यूनतम) XML दस्तावेज़ प्रदान करें जिस पर यह "काम नहीं करता"। हम केवल इतना जानते हैं कि आप "बैग में अपना हाथ डाल रहे हैं और आप जो चाहते हैं उसे नहीं ढूंढ रहे हैं" लेकिन हम नहीं जानते कि "बैग में क्या है" :) –

उत्तर

28

यह काम करना चाहिए:

//*[ancestor::foo[bar[@attr="val"]]] 

या वैकल्पिक रूप से

root/foo/bar[ancestor::foo[bar[@attr="val"]]] 

दूसरा <bar> तत्व

<root> 
    <foo> 
     <bar attr="xxx"></bar> 
    </foo> 
    <foo> 
     <bar attr="val"></bar> 
    </foo> 
    <foo> 
     <bar attr="zzz"></bar> 
    </foo> 
</root> 
+4

क्या यह वास्तव में प्रश्न का उत्तर देता है? ओपी पूर्वजों (फू) का चयन करना चाहता है .. यह उदाहरण वंश (बार) का चयन करता है जिसका पूर्वज कुछ मानदंडों से मेल खाता है। –

+3

यह प्रश्न का उत्तर नहीं देता है। निश्चित नहीं है कि इसे क्यों वोट दिया गया है। – geoidesic

+1

@geoidesic क्योंकि यह स्पष्ट रूप से ओपीएस समस्या हल करता है – Gordon

9

एक समाधान ओपी द्वारा इच्छित प्रतिबिंबित करने के लिए अद्यतन मेल खाता है।

देखें @ डेविड के जवाब

नीचे एक नमूना एक्सएमएल के लिए,

<root> 
<foo id="0"> 
    <bar attr="val"/> 
    <foo id="1"> 
     <bar attr="xxx"/> 
    </foo> 
    <foo id="2"> 
     <bar attr="val"> 
      <one>1</one> 
      <two> 
       <three>3</three> 
      </two> 
     </bar> 
    </foo> 
</foo> 

संदर्भ नोड के रूप में < तीन >, एक वैध के साथ रिवर्स अक्ष पर एक मान्य xpath समाधान

./ancestor::foo[bar[@attr='val']][position() = 1] 

"./" वैकल्पिक है। स्थिति() = 1 वैकल्पिक नहीं है अन्यथा पूर्वजों foo भविष्यवाणियों को संतुष्ट करने के लिए भी वापस कर दिया जाएगा।

पुराना जवाब: उपेक्षा

यह एक पुरानी सवाल है। लेकिन कोई भी जो दिलचस्पी लेता है, निम्नलिखित आपको मूल प्रश्न का इरादा लेना चाहिए।

रिवर्स अक्ष

//bar[@attr='val']/ancestor::*[position()=1] 

फॉरवर्ड अक्ष

//*[child::bar[@attr='val']] 
+0

"पूर्वज" के विपरीत "वंश" है, न कि "बच्चा"। "पूर्वज" "पूर्वज" – wybe

+0

@wybe के बजाय "अभिभावक" के विपरीत है, मुझे लगता है कि आप धुरी के एंटोनिम्स के साथ xpath अक्ष निर्देशों को भ्रमित कर रहे हैं। कोई भी अक्ष जो संदर्भ नोड के बाद दस्तावेज़ क्रम में नोड्स पाता है वह आगे अक्ष है। एक अक्ष जो संदर्भ नोड से पहले दस्तावेज़ क्रम में नोड्स पाती है वह एक रिवर्स अक्ष है। यदि वह आपके इरादे से संबोधित नहीं करता है, तो क्या आप कृपया उस चीज़ को प्रदान कर सकते हैं जिसका आप वास्तव में मतलब रखते हैं। – santon

+0

@wybe https://www.w3.org/TR/xpath/#axes और अनुभाग 2.4 के तहत संदर्भित करें – santon

1

मेरी राय में सर्वश्रेष्ठ उत्तर व्यक्ति जो सवाल उठाया द्वारा प्रदान किया गया। उनका समाधान सभी पूर्वजों को वापस करने के लिए माना जाता था। तो अपने xpath एक्सप्रेशन थोड़ा पर संशोधन किए जाने की आवश्यकता वह केवल निकटतम एक जो स्थिति() = 1 के साथ एक है चाहता है,:

ancestor::foo[bar[@attr="val"] and position() = 1] 

वे लिखते हैं कि ancestor::foo[bar[@attr="val"]] कुछ भी नहीं लौटाया, तो वह था अपने एक्सएमएल में कुछ अन्य समस्या या अपने XPath मूल्यांकन संदर्भ के वर्तमान तत्व के बारे में उनकी धारणा में।

अन्य उत्तरों (// से शुरू) वास्तव में प्रश्न का उत्तर नहीं देते हैं और भले ही वे किसी की आवश्यकता से मुलाकात करते हैं, इसलिए वे कुशल नहीं हैं: वे एक्सएमएल फ़ाइल में सभी तत्वों को चुनते हैं, फ़िल्टर को लागू करते हैं बाद में उन्हें। जबकि मेरे द्वारा प्रस्तावित रिश्तेदार एक्सपैथ या जो व्यक्ति इस प्रश्न से पूछ रहा था वह वर्तमान नोड से माता-पिता और उसके माता-पिता आदि से शुरू होने वाले कुछ तत्वों के माध्यम से खोज रहा है - यह बड़ी एक्सएमएल फाइलों के साथ भी बहुत प्रभावी होगा ।

+0

मैं आपके मूल्यांकन से सहमत हूं। मेरे जवाब ने ऊपर से समस्या को संबोधित किया और संदर्भ नोड से इसे संबोधित नहीं करता है। मैं इसे प्रतिबिंबित करने के लिए अपना उत्तर अपडेट करूंगा। धन्यवाद – santon

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

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