2012-09-11 16 views
9

मैं एक XPath अभिव्यक्ति है कि निम्नलिखित करता है बनाने की जरूरत:XPath: 'नोड ए' के ​​लिए चूक इसके बजाय 'नोड B' के बजाय अगर 'नोड B' खाली नहीं है

  • के अंदर तत्व देता है ' डिफ़ॉल्ट रूप से NodeA '
  • यदि यह खाली नहीं है तो' नोडबी 'के अंदर तत्व को वापस कर देता है।

    <?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.10" productVersion="14.0.0" PIVersion="1.0.0.0" href="file:///C:\Documents%20and%20Settings\Chris\Local%20Settings\Application%20Data\Microsoft\InfoPath\Designer3\9016384cab6148f6\manifest.xsf" ?><?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.3"?> 
    <my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-09-07T14:19:10" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us"> 
    <my:NodeASection> 
        <my:NodeA>2012-09-13</my:NodeA> 
    </my:NodeASection> 
        <my:NodeBSection> 
         <my:NodeBGroup> 
          <my:NodeB>2012-09-14</my:NodeB> 
         </my:NodeBGroup> 
        </my:NodeBSection> 
    </my:myFields> 
    

    यह XPath अभिव्यक्ति पाठ के अस्तित्व के लिए NodeB मूल्यांकन करने के लिए इस्तेमाल किया जा सकता:

यहां कुछ ऐसे नमूना एक्सएमएल ताकि मेरा लक्ष्य संरचना स्पष्ट रूप से देखा जा सकता है (मैं एमएस InfoPath उपयोग कर रहा हूँ) है: boolean(//my:NodeB[(text())])

मैंने "बेकर विधि" के बारे में सुना है लेकिन मुझे यकीन नहीं है कि दोनों नोड्स मौजूद होने पर यह कैसे लागू होता है। मैं बहुत XPath के लिए नया हूं और पेशकश की जा सकती किसी भी मदद की सराहना करता हूं।

उत्तर

15

यह XPath अभिव्यक्ति NodeB रिटर्न यदि वह मौजूद है (और पाठ सामग्री है) और NodeA अन्य मामले में:

//my:NodeB[text()] | //my:NodeA[text() and not(//my:NodeB[text()])] 

आप सभी उप-तत्व आप /* चयनित नोड के बाद जोड़ सकते हैं पाने के लिए चाहते हैं, इस

//my:NodeB[text()]/* | //my:NodeA[text() and not(//my:NodeB[text()])]/* 
+0

आप बीओएमबी हैं! मैंने पूरे दिन कल भी उस प्रश्न को तैयार करने की कोशिश की। मैन मुझे इस सामान के लिए कक्षा लेने की जरूरत है ... मैंने इसे अपने थोड़ा और जटिल मुद्दे पर अनुकूलित किया है। एक बार फिर धन्यवाद! – Shrout1

1

यदि यह सच है कि किसी भी NodeA के दस्तावेज़ आदेश (के रूप में अपने नमूना से गर्भित) में NodeB से पहले आ जाएगा पर भरोसा करने के लिए सुरक्षित है की तरह है, तो एक सरल और भी बहुत कुछ कुशल xpath एक्सप्रेशन आवश्यक तत्व का चयन करने है ...

(//my:NodeA[text()]|//my:NodeB)[1] 

उपरोक्त तत्व तत्व का चयन करता है। आप तत्व का टेक्स्ट नोड का चयन करना चाहते हैं, तो बजाय का उपयोग करें ...

(//my:NodeA[text()]|//my:NodeB)[1]/text() 

अगर वहाँ NodeA और NodeB के बीच कोई स्थितीय संबंध (वे किसी भी रिश्तेदार क्रम में आ सकता है) है, और आप XPATH 2.0 का उपयोग कर रहे हैं, उसके बाद निम्न अभिव्यक्ति आवश्यक पाठ नोड का चयन करेंगे ..

(//my:NodeA[text()],//my:NodeB)[1]/text() 
3

एक सही XPath अभिव्यक्ति है:

(//my:NodeB[node()] | //my:NodeA[not(//my:NodeB/node())])/node() 

भविष्यवाणियों की स्थितियों परस्पर अनन्य हैं, उनमें से केवल एक ही true() हो सकता है और यह गारंटी देता है कि दो नोड्स में से केवल एक को ब्रैकेट के भीतर अभिव्यक्ति द्वारा चुना जाता है।

तो, ऊपर दी गई अभिव्यक्ति किसी भी नोड का चयन करती है जो कि my:NodeB है यदि उसके बच्चे हैं, या my:NodeA - अन्य आकार।

यहां हम मानते हैं कि my:NodeA नामक अधिकांश तत्वों पर और my:NodeB नामक अधिकांश तत्व XML दस्तावेज़ में मौजूद हैं।

एक और धारणा यह है कि नामस्थान जिस पर उपसर्ग my बाध्य है XPath अभिव्यक्ति मूल्यांकनकर्ता (आपके द्वारा उपयोग किए जा रहे विशिष्ट XPath कार्यान्वयन) के साथ "पंजीकृत" है।

ध्यान दें करो कि प्रदान की XML दस्तावेज में तत्वों my:NodeA और my:NodeB की न तो कोई तत्व बच्चों (वे दोनों सिर्फ एक पाठ नोड बच्चा है) है - तो मुझे लगता है कि "तत्व" से आप वास्तव में मतलब है "नोड "।

+0

Dimitre - फिर से धन्यवाद! आपकी प्रतिक्रिया अधिक व्यापक रूप से लागू प्रतीत होती है। मैं इन सभी के लिए नया हूं इसलिए मुझे क्षमा करें यदि मैं गलत तरीके से शब्दावली का उपयोग कर रहा हूं; बस जैसे ही मैं इसे लेने की कोशिश कर रहा हूँ! मुझे नहीं पता कि कैसे एमएस इन्फोपाथ एक्सपीएथ का मूल्यांकन 'मेरा' नामस्थान के साथ करता है। हालांकि डेविड पार्सन का जवाब अच्छा काम करता था! मुझे विश्वास है कि [नोड()] जांच हालांकि अधिक व्यापक रूप से लागू हो सकती है। – Shrout1

+0

@ क्रिस, यह सब निर्भर करता है कि "खाली" से आपका क्या मतलब है - और इसके लिए सार्वभौमिक परिभाषा नहीं है। वर्तमान में स्वीकार्य उत्तर सबसे अधिक संभावना "खाली" की व्याख्या करता है क्योंकि टेक्स्ट-नोड बच्चा नहीं है। मेरा जवाब "खाली" की व्याख्या करता है क्योंकि कोई बच्चा नहीं है (इसलिए एक तत्व जिसमें बच्चों के रूप में अन्य तत्व हैं, लेकिन कोई टेक्स्ट-नोड बच्चे को खाली नहीं माना जाता है। अन्य लोग चाहते हैं कि कम से कम एक टेक्स्ट-नोड बच्चा होना चाहिए केवल व्हाइटस्पेस वर्णों से बना नहीं है। यदि आप कड़ाई से "खाली" की परिभाषा को परिभाषित करते हैं, तो लोग अधिक सटीक उत्तर दे सकते हैं। –

+0

इस उदाहरण में यह अनुपलब्ध पाठ की जांच कर रहा है। InfoPath फ़ील्ड्स को XML तत्व (या नोड?) और इसलिए हमेशा एक पूर्व-विद्यमान संरचना होगी। कई रूपों में मैंने टेबल या खंड दोहराया है और उस उदाहरण में कोई नोड के "अस्तित्व" की जांच कर सकता है। – Shrout1

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