ऐसा लगता है कि XPath और XQuery विशेषताओं का चयन कैसे करते हैं, इसमें कोई अंतर है। यहाँ W3Schools से चुराया गया एक खिलौना उदाहरण है:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
    <book category="children">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
</bookstore> 

मैं lang विशेषताओं के मान पुनर्प्राप्त करना चाहता हूं। तो, भोलेपन से मैं करता हूँ: //title/@lang जो XPath मूल्यांकनकर्ता पर पूरी तरह से काम करता है लेकिन XQuery मूल्यांकनकर्ता पर नहीं

मुझे यह जानने के लिए क्या चाहिए: XQuery मूल्यांकनकर्ता पर काम करने के लिए मुझे अपना XPath एक्सप्रेशन कैसे लिखना चाहिए?

मैं क्या जानना चाहता हूं: क्या हो रहा है?!

यहाँ टीएल भाग है:

मैं इन क्षमताओं के बिना एक विरासत मंच पर हूं इसलिए मैं एक्सएमएल और मेरी क्वेरी अभिव्यक्ति को बाहरी सेवा में भेजता हूं, जो मुझे लगता है कि एक सैक्सन-आधारित XQuery मूल्यांकनकर्ता है। मेरा सिंटैक्स CodeBeautify's XPath Tester पर अपेक्षित रूप से काम करता है।

मैंने इस अंतर को xpathtester.com पर भी सत्यापित किया है: यह XPath मोड में अपेक्षानुसार काम करता है लेकिन इसमें नहीं XQuery मोड। (नोट: लिंक एन्क्रिप्टेड नहीं है।)

Xpathtester.com निम्न त्रुटि संदेश देता है: ERROR - Cannot create an attribute node (lang) whose parent is a document node

1
mappo 10 मार्च 2020, 11:34
XQuery के साथ काम नहीं करने पर आपको वास्तव में कौन सी त्रुटि या परिणाम मिलता है? किसी तत्व का हिस्सा नहीं होने के कारण विशेषता नोड्स को क्रमबद्ध करने में सक्षम नहीं होने के बारे में कुछ संदेश?
 – 
Martin Honnen
10 मार्च 2020, 11:52
होनन: xpathtester.com शिकायत करता है कि "त्रुटि - एक विशेषता नोड (लैंग) नहीं बना सकता जिसका मूल एक दस्तावेज़ नोड है" लेकिन हमारी बाहरी सेवा शिकायत किए बिना कोई हिट नहीं लौटाती है।
 – 
mappo
10 मार्च 2020, 11:55
2
मुझे लगता है कि आपको जो परिणाम मिलेगा वह बहुत हद तक XQuery टूल और API के उपयोग पर निर्भर करेगा, XPath और XQuery दोनों में एक विशेषता नोड का चयन करना संभव है, लेकिन XQuery का सामान्य परिणाम कुछ नव निर्मित और फिर क्रमबद्ध परिणाम और मुफ्त है स्थायी विशेषता को XML क्रमांकन के सामान्य डिफ़ॉल्ट के साथ क्रमबद्ध नहीं किया जा सकता है। XQuery 3.1 में, आप उन्हें adaptive आउटपुट विधि का उपयोग करके क्रमबद्ध कर सकते हैं: xqueryfiddle.liberty-Development। नेट/3Nzd8bR
 – 
Martin Honnen
10 मार्च 2020, 12:04
1
XQuery डिफ़ॉल्ट रूप से एक त्रुटि उत्पन्न करेगा यदि यह एक मान्य XML आउटपुट बनाने में असमर्थ है। एट्रिब्यूट्स नोड्स का एक क्रम मान्य एक्सएमएल आउटपुट नहीं है (एक्सएमएल एट्रिब्यूट्स को एक एलिमेंट नोड द्वारा रखा जाना चाहिए, जिसके बारे में आपका त्रुटि संदेश शिकायत कर रहा है)। आप <ul>{for $l in //title/@lang return <li>{$l}</li>}</ul> का उपयोग कर सकते हैं यदि आप एक XML बनाना चाहते हैं जिसमें वैकल्पिक आउटपुट विधियों का उपयोग किए बिना आपके इनपुट XML के सभी lang गुण हों (इसे यहां आजमाएं)
 – 
Aaron
10 मार्च 2020, 12:37
@Aaron: इस जानकारी के लिए धन्यवाद कि XQuery को पूर्ण तत्व वापस करने की आवश्यकता है। मुझे यह नहीं पता था। मुझे वास्तव में आपके स्निपेट का बिंदु नहीं दिख रहा है। क्या परिणाम XPath //title के समान नहीं है?
 – 
mappo
10 मार्च 2020, 17:10

2 जवाब

व्यंजक //title/@lang XPath और XQuery दोनों के अंतर्गत मान्य है, और दो विशेषता नोड्स का एक क्रम देता है।

जहां आप अंतर देख रहे हैं, वह यह है कि अलग-अलग XPath और XQuery क्लाइंट दो विशेषता नोड्स वाले परिणाम को कैसे संभालते हैं।

यदि उपकरण परिणाम को XML के रूप में क्रमबद्ध करने का प्रयास करता है, तो यह विफल हो जाएगा, क्योंकि XML क्रमांकन एक दस्तावेज़ नोड बनाने और दस्तावेज़ में विशेषताओं को संलग्न करने का प्रयास करता है।

इसलिए आपको यह देखने की आवश्यकता है कि परिणाम प्रदर्शित करने के लिए आपका XPath या XQuery उपकरण कौन से विकल्प प्रदान करता है।

1
Michael Kay 10 मार्च 2020, 13:58

वास्तव में यह समझने के बाद कि @Martin Honnen और @Aaron किस बारे में बात कर रहे थे और ट्यूटोरियल में कुछ गहरे गोता लगा रहे थे, मुझे लगता है कि मैं एक समाधान के साथ आया हूँ जिससे मैं खुश हूँ:

string-join((for $l in //title/@lang return string($l)) , ',')

https://xqueryfiddle.liberty-development.net/3Nzd8bR/2

1
mappo 10 मार्च 2020, 17:49
अच्छा है, ध्यान दें कि आप इसे string-join(//title/@lang, ',') में सरल बना सकते हैं क्योंकि string-join इसके इनपुट के तत्वों को स्वचालित रूप से स्ट्रिंग में डाल देगा।
 – 
Aaron
10 मार्च 2020, 17:55