2010-11-17 20 views
35

मैं अपनी एक्सएमएल फ़ाइल से एक नोड लेना चाहता हूं, नोड में "नवीनतम_" जैसे उपसर्ग है, लेकिन यह बदल सकता है और मैं अपने एक्सएसएलटी के लिए यथासंभव तरल पदार्थ के रूप में उत्सुक हूं। यहाँ XPath मैं का उपयोग करना चाहते है:नोड नाम पर XPath वाइल्डकार्ड

/data/stats/*_cost 

यह मैच चाहिए latest_cost, newest_cost, anything_cost, वहाँ ऐसा करने का एक तरीका है?

चियर्स :-)

+0

इस पर निर्भर करता है कि XPath 2.0 आपके पर्यावरण में उपलब्ध है या नहीं। XPath 1.0 यह अनुमति नहीं देता है और 2.0 करता है। – Younes

+0

'* _cost' जैसे अभिव्यक्तियों के लिए न तो XPath 1.0 और न ही XPath 2.0 उन्हें अनुमति देता है। –

उत्तर

58

इस्तेमाल कर सकते हैं यह सही XPath 1.0 अभिव्यक्ति है जो किसी भी नाम स्थान में नाम बराबर करने के लिए "_cost" के अंतिम 5 चरित्र के साथ एक तत्व का चयन है।

/data/stats/*[substring(name(), string-length(name()) - 4) = '_cost'] 
+0

उचित बिंदु, मैंने इसे अपने आवेदन में इनपुट किया है और यह अन्य नुकसान के बिना मुझे इसकी आवश्यकता है, मेरी टिप्पणी reqsquare पर देखें। धन्यवाद। –

+0

@ILMV: आप कल्याण कर रहे हैं। मुझे खुशी है कि यह आपकी मदद करता है। –

+0

+1 और @ user357812 के लिए धन्यवाद - यह मेरे समान उपयोग मामले (मिलान विशेषता प्रत्यय) के लिए बहुत उपयोगी रहा है। यह कैसे करें [यहां] (http://blog.jondh.me.uk/2011/10/simplexml-xpath-selector-attribute-not-having-suffix/) अगर कोई दिलचस्पी लेता है। – halfer

5

XPath 1.0 के साथ आप /data/stats/*[substring-after(name(), '_cost') = ''] पैटर्न का उपयोग कर सकते हैं। यह जांचता है कि तत्व का नाम _cost प्रत्यय के साथ समाप्त होता है या नहीं। XPath 2.0 में fn:ends-with(str, str) है और आपका संबंधित एक्सपर्सन *[ends-with(name(), '_cost')] होगा।

+0

आपके उत्तर के लिए धन्यवाद, मेरे लिए अच्छी तरह से काम किया है क्योंकि यह जांचता है कि स्ट्रिंग भी मौजूद है या नहीं। इसके अलावा मेरे पर्यावरण में XPath 2. प्रतीत नहीं होता है :-) –

+2

@ILMV के रूप में इंगित करता है, यह इसके नाम पर "_cost" के बिना एक तत्व का चयन करेगा। मेरा जवाब जांचें। –

+0

@Alejandro, मेरी गलती को इंगित करने के लिए धन्यवाद। –

5

तुम भी contains

, उदा,

/data/stats[contains(.,'_cost')] 
+0

'है। सभी टेक्स्ट सामग्री के लिए खड़ा है और यह अभिव्यक्ति उन सभी 'आंकड़े' नोड्स से मेल खाती है, जिनमें टेक्स्ट सामग्री में '_const' substring शामिल है। पोस्टियन और नोड नामों के बारे में कोई गारंटी नहीं है। –

+1

'/ डेटा/आंकड़े/* [इसमें शामिल हैं (स्थानीय नाम(), '_ लागत')]' हालांकि काम करेगा ... – annakata

+0

मैं अंत में इसके साथ गया '[इसमें शामिल है (स्थानीय नाम(),' _ लागत ')] ', यह ऐसी स्थिति के खिलाफ भेदभाव नहीं करता है जो शर्म की बात है, लेकिन इसके उपयोग के संदर्भ में जो वास्तव में कोई फर्क नहीं पड़ता। –

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