2012-02-29 8 views
17

के बीच अंतर कोई पाठ() और स्ट्रिंग() फ़ंक्शंस के बीच अंतर को समझा सकता है। मैं अक्सर एक दूसरे के साथ उपयोग करता हूं, लेकिन इससे कोई फर्क नहीं पड़ता है, दोनों को एक्सएमएल नोड का स्ट्रिंग मान मिलेगा।टेक्स्ट() और स्ट्रिंग()

उत्तर

34

क्या कोई पाठ() और स्ट्रिंग() फ़ंक्शंस के बीच अंतर को समझा सकता है।

मैं text() एक समारोह लेकिन एक node test नहीं है।

इसका उपयोग संदर्भ नोड के सभी टेक्स्ट-नोड बच्चों का चयन करने के लिए किया जाता है।

इसलिए, यदि संदर्भ नोड x नामक तत्व है, तो text()x के सभी टेक्स्ट-नोड बच्चों का चयन करता है।

अन्य उदाहरण:

/a/b/c/text() 

किसी भी c तत्व है कि किसी भी b तत्व यह है कि शीर्ष तत्व a का एक बच्चा है का एक बच्चा है के सभी पाठ नोड बच्चों का चयन करता है।

II। string() फ़ंक्शन

परिभाषा द्वारा string(exprSelectingASingleNode) नोड के string value लौटाता है।

किसी दस्तावेज़ का स्ट्रिंग मान दस्तावेज़ ऑर्डर में अपने सभी टेक्स्ट-नोड वंशों का संगतता है।

इसलिए, यदि निम्न XML दस्तावेज़ में:

<a> 
    <b>2</b> 
    <c>3 
    <d>4</d> 
    </c> 
    5 
</a> 

string(/a) रिटर्न (आसपास के उद्धृत्ध)

" 
    2 
    3 
    4 

    5 
" 

के रूप में हम देखते हैं, स्ट्रिंग मान तीन सफेद-अंतरिक्ष को दर्शाता है केवल पाठ-नोड्स, जिन्हें हम आम तौर पर नोटिस करने और खाते में विफल होने में विफल रहते हैं।

कुछ एक्सएमएल पार्सर्स के पास व्हाइट-स्पेस-केवल टेक्स्ट नोड्स को अलग करने का विकल्प होता है।

string(/a) 

अब रिटर्न:

"23 
    4 
    5 
" 
6

अधिकांश समय, आप सामग्री चाहते हैं तो ऊपर दस्तावेज़ केवल सफेद-अंतरिक्ष-पाठ बंद छीन नोड्स, तो एक ही समारोह के साथ पार्स किया गया था एक तत्व नोड एक्स का, आप इसे "।" के रूप में संदर्भित कर सकते हैं, यदि यह संदर्भ नोड है, या "एक्स" के रूप में यदि यह संदर्भ नोड का बच्चा है।उदाहरण के लिए:

<xsl:if test="X = 'abcd'">... 

या

<xsl:value-of select="."/> 

दोनों मामलों में, क्योंकि संदर्भ एक स्ट्रिंग की मांग, string() समारोह स्वचालित रूप से लागू किया जाता है। (यह थोड़ा सा सरलीकरण है, यदि आप स्कीमा-जागरूक एक्सएसएलटी 2.0 चला रहे हैं तो नियम थोड़ा अधिक जटिल हैं)।

"string()" का उपयोग करना अनावश्यक है, क्योंकि यह स्वचालित रूप से किया जाता है; और text() का उपयोग करना एक गलती है (एक ऐसा लगता है जो वेब पर कुछ खराब ट्यूटोरियल द्वारा प्रोत्साहित किया जाता है)। इस स्थिति में ./text() या X/text() का उपयोग करके आप तत्व के सभी टेक्स्ट नोड बच्चों को प्रदान करते हैं। अक्सर तत्व में एक टेक्स्ट नोड बच्चा होता है जिसका स्ट्रिंग मान तत्व के स्ट्रिंग मान के समान होता है, लेकिन यदि कोई टिप्पणी या प्रोसेसिंग निर्देश जोड़ता है तो आपका कोड विफल हो जाता है, क्योंकि मान को कई टेक्स्ट नोड्स में विभाजित किया जाता है। अगर तत्व एक है यह भी विफल रहता है (कहते हैं कि "title") जो मिश्रित सामग्री की अनुमति देता है: string(title) और title/text() एक ही जवाब देने के लिए जा रहे हैं जब तक आप शीर्षक के साथ एक लेख मारा

<title>On the wetness of H<sub>2</sub>O</title> 
+0

मुझे लगता है कि एक का उपयोग कर विश्वास करने के लिए इस्तेमाल किया अभिव्यक्ति = "/ somenode/text()" जैसी अभिव्यक्ति वास्तव में अधिक सटीक और कम त्रुटि प्रवण होगी। तो आप सुझाव दे रहे हैं कि/text() हिस्सा अनावश्यक है, यहां तक ​​कि एक गलती भी? क्या आप संक्षेप में चर्चा कर सकते हैं जब यह एक अच्छा विचार है या उपयोग/पाठ() का उपयोग करने के लिए उपयोगी है? धन्यवाद – user8658912

+0

टिप्पणियां पूरक प्रश्न पूछने के लिए डिज़ाइन नहीं की गई हैं, कृपया एक नया प्रश्न उठाएं। –

+0

(दूसरे शब्दों में) आपका कथन कि _ "स्ट्रिंग() स्वचालित रूप से लागू होता है" _ कई एक्सएसएलटी तत्वों में सत्य है, जैसे xsl: value-of। हालांकि, ध्यान दें कि उपयोगकर्ता अपने प्रश्न में XSLT का उल्लेख नहीं करता है। इसलिए, जैसा कि आपने समझाया है, टेक्स्ट() या स्ट्रिंग() का उपयोग करना आमतौर पर गलत/अनावश्यक ** एक्सएसएलटी ** में है, लेकिन उदाहरण के लिए स्ट्रिंग() का उपयोग करना समझ में आता है उदाहरण के लिए XQuery में नोड के स्ट्रिंग मान की अपेक्षा करते समय, अन्यथा हम इसके बजाय पूर्ण नोड प्राप्त करेंगे, है ना? जबकि पाठ() विशेष रूप से टेक्स्ट नोड्स के माध्यम से ब्राउज़ करने के लिए अपरिवर्तित होगा। – user8658912

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