2016-09-02 7 views
5

स्टैक ओवरफ़्लो पर XPath प्रश्न के उत्तर के लिए विवरणों की खोज करते समय, मैं XPath 1.0 और 2.0 के बीच एक अंतर में भाग लेता हूं, मुझे कोई तर्क नहीं मिल सकता है।XPath 1.0 और 2.0 के बीच डॉट (।) की परिभाषा क्यों परिभाषित हुई?

मैंने यह समझने की कोशिश की कि . वास्तव में क्या मतलब है।

परिवर्तन के लिए तर्क क्या था? क्या XPath 2.0 में . और self::node() के बीच कोई अंतर है?

spec स्वयं से, परिवर्तन का इरादा मुझे स्पष्ट नहीं है। मैंने डॉट या अवधि, प्राथमिक अभिव्यक्ति, और तर्क जैसे कीवर्ड को गुगल करने की कोशिश की।

उत्तर

4

XPath 1.0 में चार डेटा प्रकार थे: स्ट्रिंग, संख्या, बूलियन और नोड-सेट। नोड्स के अलावा अन्य मूल्यों के संग्रह को संभालने का कोई तरीका नहीं था। इसका मतलब यह था कि, उदाहरण के लिए, व्युत्पन्न मूल्यों पर संक्षेप में कोई तरीका नहीं था (यदि तत्वों के पास price='$23.95' के रूप में गुण थे, तो $ साइन को अलग करके प्राप्त संख्याओं को पूरा करने का कोई तरीका नहीं था क्योंकि इस तरह के स्ट्रिपिंग का परिणाम होगा संख्याओं का एक सेट, और ऐसा कोई डेटा प्रकार नहीं था)।

तो XPath 2.0 ने अधिक सामान्य अनुक्रम प्रस्तुत किए, और इसका मतलब था कि अनुक्रमों में हेरफेर करने की सुविधाओं को सामान्यीकृत किया जाना था; उदाहरण के लिए यदि $ एक्स संख्याओं का अनुक्रम है, तो $X[. > 0] अनुक्रम को केवल सकारात्मक संख्याओं को शामिल करने के लिए फ़िल्टर करता है। लेकिन यह केवल तभी काम करता है जब "।" एक संख्या के साथ ही एक नोड के लिए संदर्भित कर सकते हैं।

3

संक्षेप में: self::node() परमाणु वस्तुओं को फ़िल्टर करता है, जबकि . नहीं करता है। परमाणु वस्तुओं (संख्याएं, तार, और कई अन्य एक्सएमएल स्कीमा प्रकार) नोड्स नहीं हैं (तत्वों, विशेषताओं, टिप्पणियों, आदि के विपरीत)।

spec से उदाहरण पर विचार करें: (1 to 100)[. mod 5 eq 0]। यदि . को self::node() द्वारा प्रतिस्थापित किया गया है, तो अभिव्यक्ति वैध XPath नहीं है, क्योंकि mod दोनों तर्कों को संख्यात्मक होने की आवश्यकता है और परमाणुकरण इस मामले में सहायता नहीं करता है।

कल्पना स्कैनिंग उन लोगों के लिए: XPath 2.0 को परिभाषित करता है item() प्रकार मिलान निर्माण, लेकिन यह node tests साथ कोई संबंध नहीं है के रूप में एटोमिक्स नोड्स और अक्ष चरण हमेशा लौट सिर्फ नोड नहीं हैं। इसलिए, डॉट को self::item() के रूप में परिभाषित नहीं किया जा सकता है। यह वास्तव में एक विशेष भाषा निर्माण होने की जरूरत है।

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