2009-01-27 12 views
6

क्या xQuery से 2 दस्तावेज़ खोलना संभव है और उन पर शामिल होना संभव है?XQuery एकाधिक एक्सएमएल फाइलें?

for $x in doc('doc1.xml')//a 
for $y in doc('doc2.xml')//a 
where $x/@name = $y/@name 
return $x 

फिर अपने XQuery प्रोसेसर बहुत चालाक को पहचानना है कि यह एक में शामिल होने है किया जाना चाहिए:

उत्तर

9

हाँ, यहाँ XQuery spec से an example है:।।

"में शामिल है, जो एक एकल परिणाम में एकाधिक स्रोतों से डेटा गठबंधन, क्वेरी की एक बहुत ही महत्वपूर्ण प्रकार के होते हैं इस भाग में हम उदाहरण देकर स्पष्ट करना होगा कि कई मिलती है के प्रकार XQuery में व्यक्त किया जा सकता हम निम्नलिखित तीन दस्तावेजों पर हमारे उदाहरण का आधार होगा:।

  1. parts.xml नामक एक दस्तावेज है कि कई part तत्व शामिल हैं, बारी में प्रत्येक part तत्वमें शामिल हैऔर description उपखंड।
  2. suppliers.xml नामक एक दस्तावेज़ जिसमें supplier तत्व शामिल हैं; प्रत्येक supplier तत्व में बदले में suppno और suppname सबलेमेंट्स शामिल हैं।
  3. catalog.xml नामक एक दस्तावेज़ जिसमें आपूर्तिकर्ताओं और भागों के बीच संबंधों के बारे में जानकारी शामिल है। कैटलॉग दस्तावेज़ में कई item तत्व हैं, जिनमें से प्रत्येक में partno, suppno, और price सबलेमेंट्स शामिल हैं।

एक पारंपरिक ("आंतरिक") दो या दो से अधिक संबंधित स्रोतों से रिटर्न जानकारी में शामिल हो जाता है, जैसा कि निम्नलिखित उदाहरण से सचित्र है, जो तीन दस्तावेजों से जानकारी को जोड़ता है। उदाहरण कैटलॉग दस्तावेज़ से व्युत्पन्न "वर्णनात्मक कैटलॉग" उत्पन्न करता है, लेकिन आपूर्तिकर्ता संख्याओं के बजाय भाग संख्याओं और आपूर्तिकर्ता नामों के बजाय भाग विवरण शामिल करता है। नई सूची हिस्सा वर्णन से और दूसरी प्राथमिकता आपूर्तिकर्ता नाम से वर्णानुक्रम है। *

<descriptive-catalog> 
    { 
    for $i in fn:doc("catalog.xml")/items/item, 
     $p in fn:doc("parts.xml")/parts/part[partno = $i/partno], 
     $s in fn:doc("suppliers.xml")/suppliers 
        /supplier[suppno = $i/suppno] 
    order by $p/description, $s/suppname 
    return 
     <item> 
      { 
      $p/description, 
      $s/suppname, 
      $i/price 
      } 
     </item> 
    } 
</descriptive-catalog> 

पूर्व क्वेरी केवल भागों है कि आपूर्तिकर्ताओं और आपूर्तिकर्ताओं है कि भागों है के बारे में जानकारी देता है। बाहरी शामिल एक ऐसा जुड़ाव है जो भाग लेने वाले स्रोतों में से एक या अधिक से अधिक जानकारी को संरक्षित करता है, जिसमें अन्य स्रोतों में कोई तत्व तत्व नहीं है।उदाहरण के लिए, एक बाहरी में शामिल होने के आपूर्तिकर्ताओं और भागों के बीच छोड़ दिया आपूर्तिकर्ताओं कोई मिलता-जुलता भागों है कि के बारे में जानकारी वापस कर सकती है। "

ध्यान दें कि XQuery एक मानक दस्तावेज़ नहीं है() फ़ंक्शन (यह एक XSLT function है) और बदले doc() समारोह है, जो "XQuery 1.0 and XPath 2.0 Functions and Operators" का हिस्सा है

वहाँ क्रिस द्वारा जवाब में कम से कम दो त्रुटियाँ हैं:।

  1. XQuery is case sensitive - क्रिस 'उदाहरण में उपयोग किए गए पूंजीकृत कीवर्ड को एक अनुरूप XQuery प्रोसेसर द्वारा अनुमति नहीं दी जाएगी।
  2. मानक फ़ंक्शन जैसे दस्तावेज़() को उपसर्ग करना आवश्यक नहीं है, मैं केवल XQuery spec को उद्धृत कर रहा हूं, जिसमें उपसर्ग है। अन्यथा, मेरे अपने कोड में मैं "fn" उपसर्ग छोड़ दूंगा।
  3. फ़ंक्शन दस्तावेज़() मानक XQuery/XPath फ़ंक्शन नहीं है। इसके बजाय doc() फ़ंक्शन का उपयोग किया जाना चाहिए।
0

XQuery में यदि आप निम्नलिखित की तरह कुछ लिखें।

आपने कभी भी XQuery में स्पष्ट रूप से निर्दिष्ट नहीं किया है कि कुछ शामिल है। XQuery में सामान्य विषय यह है कि आपका प्रोग्राम जानकारी जो आप चाहते हैं, इसकी गणना करने के लिए कहता है।

हालांकि ऐसा लगता है कि आप अभ्यास में दूसरे दस्तावेज़ पर बार-बार लूपिंग कर रहे हैं, असली XQuery प्रोसेसर यह अधिक बुद्धिमान ढंग से निष्पादित करेगा, लगभग एसक्यूएल कथन के लगभग समान है (मेरा एसक्यूएल बहुत जंगली है इसलिए अगर मैं यह वाक्यविन्यास पूरी तरह से क्षमा चाहता हूं तो मैं क्षमा चाहता हूं गलत)

SELECT doc1.a 
FROM doc1 INNER JOIN doc2 
WHERE doc1.name = doc2.name 

XMark बेंचमार्क कई नमूना प्रश्नों होता है, इन में अच्छी तरह से एक बार देख लायक हैं। विशेष रूप से 9 से 12 प्रश्न पूछताछ में शामिल होते हैं।

0

यह है कि तुलना में आसान है (कम से कम सैक्सन उपयोग करते हुए):

let $items := (
    doc("file1.xml") , 
    doc("file2.xml") , 
    doc("file3.xml") 
) 

for $x in $items ... 
+1

यह शायद एक टाइपो है, लेकिन आप 'खोलने जा रहे file1.xml' 3 बार। –

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