2011-05-13 6 views
17

मैं एक XPath अभिव्यक्ति लिख रहा था, और मुझे एक अजीब त्रुटि मिली जो मैंने तय की, लेकिन निम्नलिखित दो XPath अभिव्यक्तियों के बीच क्या अंतर है?सामान्यीकृत-स्थान (।) और सामान्यीकृत-स्थान (टेक्स्ट()) के बीच क्या अंतर है?

"//td[starts-with(normalize-space()),'Posted Date:')]" 

और

"//td[starts-with(normalize-space(text()),'Posted Date:')]" 

मुख्य रूप से, क्या होगा पहले XPath अभिव्यक्ति पकड़? क्योंकि मुझे बहुत सारे अजीब परिणाम मिल रहे थे। तो text() मिलान में क्या करता है? साथ ही, क्या कोई अंतर है यदि मैंने normalize-space() & normalize-space(.) कहा?

+0

अपने स्वयं के परीक्षण से 'सामान्यीकृत-स्थान()' और 'सामान्यीकृत-स्थान (।)' का एक ही प्रभाव है। – CJ7

उत्तर

36

अच्छा, असली सवाल यह है: . और text() के बीच क्या अंतर है?

. वर्तमान नोड है। और यदि आप इसका उपयोग करते हैं जहां एक स्ट्रिंग की अपेक्षा की जाती है (यानी normalize-space() के पैरामीटर के रूप में), इंजन स्वचालित रूप से नोड के स्ट्रिंग मान में नोड को परिवर्तित करता है, जो तत्व के लिए तत्व के भीतर सभी टेक्स्ट नोड्स के लिए होता है। (क्योंकि मैं सवाल का अनुमान लगा रहा हूं वास्तव में तत्वों के बारे में है।)

text() दूसरी ओर केवल टेक्स्ट नोड्स का चयन करता है जो वर्तमान नोड के प्रत्यक्ष बच्चे हैं।

इसलिए उदाहरण के लिए एक्सएमएल दिया:

<a>Foo 
    <b>Bar</b> 
    lish 
</a> 

और यह मानते हुए <a> अपने वर्तमान नोड है, क्योंकि text() दो पाठ नोड्स (Foo और lish) के एक nodeset देता है, normalize-space(.)Foo Bar lish वापस आ जाएगी, लेकिन normalize-space(text()) असफल हो जायेगी, , जो normalize-space() स्वीकार नहीं करता है।

एक लंबी कहानी को कम करने के लिए, यदि आप किसी तत्व के भीतर सभी पाठ को सामान्य बनाना चाहते हैं, तो . का उपयोग करें। यदि आप एक विशिष्ट टेक्स्ट नोड का चयन करना चाहते हैं, तो text() का उपयोग करें, लेकिन हमेशा याद रखें कि इसके नाम के बावजूद, text() एक नोडसेट देता है, जो केवल एक स्ट्रिंग में परिवर्तित हो जाता है यदि उसके पास एक तत्व है।

+1

असल में 'सामान्यीकृत-स्थान (टेक्स्ट())' एक खाली स्ट्रिंग लौटाएगा, क्योंकि यह रूट को टेक्स्ट में ले जाता है। 'सामान्यीकृत-स्पेस (// टेक्स्ट())' _Foo_ लौटाएगा, क्योंकि यह आपके नोडसेट को पहले नोड को ले कर और इसे स्ट्रिंग में परिवर्तित करके उस पर 'सामान्यीकृत-स्पेस' चला रहा है। –

+0

@Matthijs Bierman क्या आपने कोशिश की है? मेरे पास है और यह ठीक तरह से काम करता है जैसा मैंने कहा था। (एक्सपैथ 2.0 में, मैं जोड़ और मान लेगा कि संदर्भ नोड '' तत्व है।) – biziclop

+0

हाँ, मेरे पास है (मुझे यकीन नहीं था)। लेकिन मैंने XPath 1.0 में कोशिश की। मानक जेएक्सपी, लेकिन Xerces 2.11.0 :) के साथ। –

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