2011-04-01 15 views
5

यह बटन की तरह HTML तत्व, (जानबूझकर सरलीकृत) को खोजने के लिए अच्छी तरह से काम करता है:क्या संघ के लिए एक DRYER XPath अभिव्यक्ति है?

//button[text()='Buy'] 
| //input[@type='submit' and @value='Buy'] 
| //a/img[@title='Buy'] 

अब मैं एक संदर्भ के लिए इस बाध्य करने की आवश्यकता। उदाहरण के लिए, खरीदें बटन है कि एक लेबल बॉक्स के अंदर प्रकट होता है:

//legend[text()='Flubber'] 

और यह, काम करता है (.. युक्त fieldset करने के लिए हमें हो जाता है):

//legend[text()='Flubber']/..//button[text()='Buy'] 
| //legend[text()='Flubber']/..//input[@type='submit' and @value='Buy'] 
| //legend[text()='Flubber']/..//a/img[@title='Buy'] 

लेकिन इस आसान बनाने के लिए किसी भी तरह से है ? दुःख की बात है बात की इस तरह काम नहीं करता है:

//legend[text()='Flubber']/..//(
    button[text()='Buy'] 
| input[@type='submit' and @value='Buy'] 
| a/img[@title='Buy']) 

(ध्यान दें कि यह ब्राउज़र के भीतर XPath के लिए है, इसलिए XSLT समाधान में मदद नहीं करेगा।)

उत्तर

2

टिप्पणियों से :

थोड़ा समायोजन एक बजाय आईएमजी प्राप्त करने के लिए: self::a[img[@title='Buy']]। (अब केवल 'खरीदें' कम करता है, तो किया जा सकता है

उपयोग इस XPath 1.0 अभिव्यक्ति:

//legend[text() = 'Flubber']/.. 
    //*[ 
     self::button/text() 
    | self::input[@type = 'submit']/@value 
    | self::a/img/@title 
    = 'Buy' 
    ] 

संपादित:। मैं माता पिता एक्सेसर नहीं देखा था अन्य तरह से एक ही दिशा में केवल:

//*[legend[text() = 'Flubber']] 
    //*[ 
     self::button/text() 
    | self::input[@type = 'submit']/@value 
    | self::a/img/@title 
    = 'Buy' 
    ] 
+0

हम्म , यह तुलना करें 3 मानों का समापन है, जो परस्पर अनन्य भागों के साथ इस सरलीकृत उदाहरण में काम करना चाहिए। दिलचस्प है कि मेरी मूल समस्या यूनियन ऑपरेटर का भारी हाथ कैसे है, और यह परिष्करण यूनियन का सूक्ष्म उपयोग है। –

+1

@ क्रिस नोई: यह नोड सेट तुलना ("संगतता" नहीं) का उपयोग करता है और अंतिम भविष्य के अंदर उन सापेक्ष पथ स्वयं पर पारस्परिक रूप से अनन्य होते हैं क्योंकि वे सभी स्वयं धुरी से शुरू होते हैं: वे किसी भी दस्तावेज़ के साथ काम करेंगे चाहे वह सरल या जटिल हो। –

+0

हाँ, यह कुछ नए क्षितिज खुलता है। धन्यवाद! –

3

एक भी विधेय में कई शर्तें संयोजित करें:

//legend[text()='Flubber']/..//*[self::button[text()='Buy'] or 
           self::input[@type='submit' and @value='Buy'] or 
           self::img[@title='Buy'][parent::a]] 

अंग्रेजी में:

माता पिता के सभी सन्तान (या माता-पिता ही) का चयन करें पाठ "Flubber" 1 के किसी भी हैं कि) एक button तत्व होने पाठ "खरीदें" या 2) एक input तत्व एक विशेषता type जिसका मूल्य "submit" है और एक विशेषता होने के लिए किसी भी legend तत्व के लिए नामित value जिसका मूल्य है "खरीदें" या 3) एक img एक विशेषता के "खरीदें" एक मूल्य साथ title नामित होने और जिसकी मूल एक a तत्व है।

+0

बहुत अच्छा थोड़ा समायोजन आईएमजी के बजाय एक प्राप्त करने के लिए:।। स्वयं :: एक [img [@ title = 'खरीदें']] (अब अगर केवल 'खरीदें' कम किया जा सकता :) –