2011-10-21 13 views
5

मार्कलोगिक का उपयोग करना लेकिन यह शायद एक सामान्य XQuery प्रश्न है।बाल तत्व कैसे प्राप्त करें लेकिन उनके बच्चों में से कोई भी नहीं?

मेरे पास है:

<library> 
    <books> 
    <book title="whatever"> 
     <publisher>Random</publisher> 
     ....more children 
    </book> 
    <book title="another"> 
     <publisher>Simon</publisher> 
     ....more children 
    </book> 
    ... 
    </books> 
</library> 

मैं अपने खिताब का श्रेय साथ सभी [पुस्तक] तत्वों वापस करना चाहते हैं, लेकिन मैं किताब, उदा के बच्चों के किसी भी नहीं करना चाहती [प्रकाशक]। मैं इसे एक रूढ़िवादी और निष्पादक तरीके से कैसे पूरा करूं?

सहसंबंधित प्रश्न: कभी-कभी मैं बच्चों के कुछ प्राप्त करना चाहता हूं, लेकिन दूसरों को नहीं, उदाहरण के लिए सभी पुस्तक तत्वों और उनके प्रकाशक बाल तत्व प्राप्त करें, लेकिन अन्य बच्चों में से कोई भी नहीं।

धन्यवाद।

उत्तर

4

XQuery (वास्तव में एक XPath, जो XQuery के एक सबसेट है) /library/books/book तकनीकी रूप से आप क्या चाहते हैं नहीं करता है। कुछ एपीआई पुस्तक तत्वों के संदर्भ वापस कर देंगे, और आपको यह तय करने के लिए छोड़ देंगे कि आप उनके साथ क्या करना चाहते हैं, उदाहरण के लिए उनके शीर्षक प्रदर्शित करना। हालांकि, कई टूल और एपीआई इन पुस्तक तत्वों को पुस्तक में रूट किए गए पूरे उपट्री के साथ कॉपी करेंगे, और डेटाबेस के मामले में, यह अक्सर परिणाम होता है जो नेटवर्क से सर्वर पर क्लाइंट पर प्रसारित किया जाएगा। इस मामले में आप मौजूदा पुस्तक तत्वों का चयन नहीं करना चाहते हैं, आप पुस्तक तत्वों में जानकारी का सबसेट युक्त एक नया दस्तावेज़ बनाना चाहते हैं। ऐसा करने के लिए आप XQuery में तत्व कंस्ट्रक्टर्स उपयोग कर सकते हैं:

for $b in /library/books/book 
return <book title="{$b/@title}"/> 
+0

धन्यवाद माइकल! यह मेरे दिमाग में, अन्य सिफारिशों को ध्यान में रखते हुए, सबसे सुंदर दृष्टिकोण प्रतीत होता है। – bethesdaboys

0

नीचे दिए गए लिंक पर XQuery चयन वाक्यविन्यास देखें। सिंटैक्स का चयन आमतौर पर आपको उन डेटा तत्वों को पकड़ने की अनुमति देता है, जिनमें आप रुचि रखते हैं, इसे प्रारूपित करें, और उन चीज़ों को छोड़ दें जिन्हें आप परवाह नहीं करते हैं।

http://www.w3schools.com/xquery/xquery_select.asp

1

शायद आसान तरीके हैं ... लेकिन मुझे लगता है कि कुछ इस तरह विशेषताओं की प्रतिलिपि बनाएगा डब्ल्यू अन्य बच्चों के बाहर /। चेतावनी: - यह पुस्तक तत्वों का एक सेट, और कुछ नहीं देता कोड अपरीक्षित

for $i in doc()//book 
return <book>{ 
    for $a in $i/@* 
    return $a 
}</book> 
+0

धन्यवाद, यह उपयोगी है कि यह मेरे लिए एक अधिक सामान्य दृष्टिकोण के लिए एक तरह से प्रदान करता है। – bethesdaboys

0

मुझे लगता है कि माइकल Kay के लिए एक से थोड़ा बेहतर समाधान प्रत्येक वांछित विशेषता की गणना और यह थोड़ा अधिक सामान्य बनाना नहीं होगा। ध्यान देने योग्य बात यह है कि /@ एक विशेषता देता है न केवल पाठ।

उदाहरण के लिए:

for $book in /library/books/book return <book>{$book/@*}</book> 

या इससे भी अधिक आम तौर पर:

for $book in /library/books/book return element book {$book/@*} 
+2

आपको भी इसका उपयोग करने की आवश्यकता नहीं है। आप इस तरह पथ पथ अभिव्यक्ति का उपयोग कर सकते हैं: /लाइब्रेरी/पुस्तकें/पुस्तक/ {@ *}

+0

मुझे उस दृष्टिकोण की सादगी पसंद है। मेरी पहली प्रतिक्रिया, हालांकि, आपके पास अपने एक्स-पथ में तत्व क्यों है? मुझे लगता है कि मैं इस दृष्टिकोण को अपनाऊंगा। धन्यवाद। – Walt