2011-08-24 10 views
11

मैं इतना और अन्य स्थानों पर जो निम्न काम करने के लिए माना जाता है पर देखा है (इस उदाहरण ओ रेली XSLT कुकबुक से सीधे उठाया है):कैसे XPath में सेट कार्रवाई करने 1.0

(: intersection :) 
$set1[count(. | $set2) = count($set2)] 

(: difference :) 
$set1[count(. | $set2) != count($set2)] 

और यह ऐसा लगता है कि यह ठीक होना चाहिए, हालांकि यह विफल होने लगता है जब चर के बजाए वास्तविक पथों के साथ प्रयोग किया जाता है। उदाहरण के लिए, निम्न दस्तावेज़

<a> 
    <new> 
    <val>1</val> 
    <val>2</val> 
    </new> 
    <old> 
    <val>2</val> 
    <val>3</val> 
    </old> 
</a> 

और xPath अभिव्यक्ति /a/new/val[count(. | /a/old/val)=count(/a/old/val)]/text() मैं पाने के लिए उम्मीद करेंगे दिया नोड सेट { 2 } लेकिन इसके बजाय { 1 2 } हो रही है। कोई विचार क्या मैं गलत कर रहा हूँ?

+0

अच्छा सवाल, +1। अपनी समस्या के स्पष्टीकरण के लिए और एक सरल और आसान एक-लाइनर XPath अभिव्यक्ति के लिए मेरा उत्तर देखें - समाधान - कोई अन्य उत्तर इस समय समाधान का प्रस्ताव नहीं देता है। :) –

उत्तर

8

नोड-सेट चौराहे के लिए सूत्र नोड-पहचान का उपयोग करते हैं, मूल्य पहचान नहीं। यदि और केवल यदि count($n1|$n2) =1

हालांकि, अगर आप मूल्य पहचान के आधार पर एक दूसरे को काटना चाहता हूँ

दो नोड्स समान हैं।

समाधान:

उपयोग:

/a/new/val[. = /a/old/val] 

यह किसी भी /a/new/val जिसके लिए कम से कम एक /a/old/val तत्व ऐसा है कि इन दोनों तत्वों की स्ट्रिंग मान ही है वहां मौजूद चयन करता है।

+0

बहुत बढ़िया - जगह पर, यह एक आकर्षण की तरह काम करता है! –

+0

@ इयान फिलिप्स, आपका स्वागत है :) –

+0

अच्छा जवाब! क्या हम सेट * माइनस * ऑपरेशंस को भी कार्यान्वित कर सकते हैं? –

1

टिप्पणी कि चौराहे हमेशा नोड्स आम में दो मूल नोड्स-सेट के बीच द्वारा रचित एक एकल नोड सेट का परिणाम है।

इसके अलावा टिप्पणी है कि एक ही नाम और सामग्री के साथ दो नोड्स दो अलग नोड्स के रूप में इलाज किया जाना है। इस प्रकार /a/new/val/text() और /a/old/val/text() समान मूल्य रखते हैं लेकिन वे पूरी तरह से अलग टेक्स्ट नोड्स हैं।

इस प्रकार अपने वर्तमान चौराहे:

/a/new/val[count(. | /a/old/val)=count(/a/old/val)] 

, एक खाली नोड सेट के रूप में मूल्यांकित क्योंकि आप आम में किसी भी नोड के बिना दो नोड्स सेट अन्तर्विभाजक कर रहे हैं (count() आपरेशन से मेल खाते हैं कभी नहीं होगा) चाहिए। आप ऐसा कुछ कर रहे हैं:

/a/new/val & # x2229; /a/old/val = & # x2205;

जबकि /a/new और # x2229; /a/old/preceding::newnew का उत्पादन करेगा।

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