2011-04-07 8 views
16

मैं बहुत तरह एक्सएमएल का एक टुकड़ा है:परीक्षण का श्रेय

<root> 
    <foo src=""/> 
    <foo src="bar"/> 
    <foo /> 
</root> 

मुझे पता है कि जो तत्वों एक src विशेषता है, जो खाली हैं और जो मान है चाहता हूँ।

दूर मैं आ गए हैं हालांकि कि मुझे नहीं बताता है तीसरे foo विशेषता अनुपलब्ध है

$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml 

bar 

के साथ है।

+0

अच्छा प्रश्न, +1। प्रत्येक मामले के लिए एक पूर्ण और संक्षिप्त समाधान (एक-लाइनर XPath अभिव्यक्ति) के लिए मेरा उत्तर देखें। :) –

+0

@ डिमिट्रे: "पूर्ण": काफी नहीं ... –

उत्तर

23

यह src विशेषता के साथ foos का चयन करेगा।

/root/foo[not(@src)] 

अन्य दो कार्यों के लिए, मैं भाव का एक मिश्रण का प्रयोग करेंगे @TOUDIdel और @Dimitre Novatchev द्वारा ने कहा: /root/foo[@src and string-length(@src)=0] सामग्री के साथ एक src में के साथ एक खाली src, और /root/foo[@src and string-length(@src)!=0] कम महत्वपूर्ण चीज़ें के लिए साथ कम महत्वपूर्ण चीज़ें के लिए यह।

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

+1

मुझे कुत्ते और कपड़े समानता पसंद है! = 0 – Dustin

+0

धन्यवाद क्योंकि आप उत्तर दे रहे हैं, मुझे यह कहां मिल सकता है " स्ट्रिंग-लम्बाई "फ़ंक्शंस और अन्य? – someone

+0

https://www.w3.org/TR/xpath/#function-string-length –

2

/root/foo[string-length(@src)!=0] सभी foo तत्वों के पास खाली खाली मूल्य नहीं है।

दुर्भाग्य /root/foo[string-length(@src)=0] तत्व है जो src नहीं है विशेषता इंगित करता है और यह भी तत्वों src विशेषता लेकिन खाली की है।

+0

वैसे यह समस्या को हल नहीं करता है! जब विशेषता गुम होती है और जब विशेषता खाली होती है तो मुझे महत्वपूर्ण रूप से अंतर करने की आवश्यकता होती है। :-) – hendry

2

उपयोग:

//*[@src and not(string-length(@src))] 

यह है कि एक src विशेषता जिसका स्ट्रिंग-मान शून्य की लंबाई है XML दस्तावेज में सभी तत्वों का चयन करता है।

//*[@src and string-length(@src)] 

यह है कि एक src विशेषता जिसका स्ट्रिंग-मूल्य लंबाई कि शून्य नहीं दे रहा है XML दस्तावेज में सभी तत्वों का चयन करता है।

//*[@src and string-length(normalize-space(@src))] 

यह है कि एक src विशेषता जिसका स्ट्रिंग-मूल्य प्रारंभिक खाली स्थान के छोड़कर और समाप्त होने के बाद लंबाई कि शून्य नहीं दे रहा है XML दस्तावेज में सभी तत्वों का चयन करता है।

//[not(@src)] 

यह है कि एक src विशेषता नहीं है XML दस्तावेज में सभी तत्वों का चयन करता है।

+0

फिर भी मुझे यह जांचने की विधि नहीं दिखाई दे रही है कि स्रोत विशेषता बिल्कुल है। :/मैं src विशेषता खोने के लिए '' केस को ध्वजांकित करना चाहता हूं। – hendry

+0

@ हेन्ड्री: क्यों, सभी अभिव्यक्तियों का परीक्षण बिल्कुल ठीक है: 'someExpr [@src]' का अर्थ है: 'कुछ एक्स्प्र' चुनने वाले सभी नोड्स का चयन करें और जिनके पास 'src' विशेषता है। –

+0

@ डिमेट्रे: इसे वर्तनी देने के लिए, उसका मतलब है कि 'src' विशेषता नहीं है। बस 'नहीं' ऑपरेटर का उपयोग करें; मेरा जवाब देखें –

10

मुझे पता है कि जो तत्वों एक src विशेषता है, जो खाली हैं और जो मान है चाहता हूँ।

तत्वों (कोई स्ट्रिंग-मूल्य) एक @src विशेषता जो खाली है होने:

//*[@src[not(string())]] 

एक @src विशेषता है जो मूल्य (स्ट्रिंग-मूल्य) है होने तत्व:

//*[string(@src)] 

से http://www.w3.org/TR/xpath/#section-String-Functions

नोड-सेट को नोड-स्ट्रिंग में नोड के स्ट्रिंग-वैल्यू को वापस कर एक स्ट्रिंग में परिवर्तित किया जाता है जो पहले दस्तावेज़ ऑर्डर में होता है। यदि नोड-सेट खाली है, तो खाली स्ट्रिंग लौटा दी जाती है।

से http://www.w3.org/TR/xpath/#function-boolean

एक स्ट्रिंग सच है यदि और केवल यदि इसकी लंबाई गैर-शून्य है।

+0

' // * [नहीं (स्ट्रिंग())] 'किसी भी विशेषता के बिना कुछ मतलब होगा? – someone

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