2008-09-02 14 views
8

मेरे पास एक ऐसा एप्लिकेशन है जो XPath का उपयोग कर किसी XML फ़ाइल से डेटा निकालता है। यदि उस XML स्रोत फ़ाइल में कोई नोड गुम है, तो मैं मान "एन/ए" (ओरेकल एनवीएल फ़ंक्शन की तरह) वापस करना चाहता हूं। चाल यह है कि एप्लिकेशन एक्सएसएलटी का समर्थन नहीं करता है; मैं अकेले XPath और XPath का उपयोग करके ऐसा करना चाहता हूं।क्या मैं XPath में एक लापता टैग के लिए कोई मान बना सकता हूं?

क्या यह संभव है?

उत्तर

5

यह किया जा सकता है, लेकिन केवल अगर नोड मौजूद होने पर वापसी मूल्य नोड का स्ट्रिंग मान है, नोड स्वयं नहीं है। XPath

substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz))) 

, baz तत्व की स्ट्रिंग मान वापस आ जाएगी यदि वह मौजूद है अन्यथा स्ट्रिंग "N/A"।

दृष्टिकोण सामान्यीकरण करने के लिए:

substring(concat($null-value, $node), 
      (string-length($null-value) + 1) * number(boolean($node))) 

जहां $null-value शून्य मान स्ट्रिंग और $node नोड का चयन करने के अभिव्यक्ति है। ध्यान दें कि यदि $node एक नोड-सेट का मूल्यांकन करता है जिसमें एक से अधिक नोड होते हैं, तो का स्ट्रिंग मान पहले नोड का उपयोग किया जाता है।

3

संक्षिप्त उत्तर: नहीं। इस तरह के एक समारोह को XPath spec के संस्करण 2 के लिए स्पष्ट रूप से अस्वीकार कर दिया गया था (गैर-मानक Illustrative User-written Functions section देखें)।

1

यह XPath 1.0 के साथ किया जा सकता है। ,

substring("N/A", 4 * number(boolean(/foo/baz))) 

वापस आ जाएगी "N/A" अगर अभिव्यक्ति /foo/baz एक खाली नोड सेट देता है, अन्यथा यह रिटर्न आप

<foo> 
    <bar/> 
</foo> 

है आप अगर foo एक baz बच्चा है परीक्षण करना चाहते हैं कहो एक खाली स्ट्रिंग।

1

@jelovirt

तो अगर मैं इस सही ढंग से समझ, हम डिफ़ॉल्ट जवाब और नोड के मूल्य जोड़, और फिर नोड के अस्तित्व स्थापित करने के लिए के लिए परीक्षण से जिसके परिणामस्वरूप स्ट्रिंग का सही सबसेट लेने मेरी डिफ़ॉल्ट स्ट्रिंग के बाद या तो शून्य या स्थिति को ऑफसेट करें। यह मैंने कभी देखा है कि एक भाषा का सबसे विकृत मोड़ है। (मुझे यह पसंद है!)

आपने जो कहा है उसे स्पष्ट करने के लिए, यह दृष्टिकोण काम करता है जब नोड गुम हो जाता है, न कि जब नोड खाली होता है। लेकिन "स्ट्रिंग-लम्बाई ($ नोड)" के साथ "संख्या (बूलियन ($ नोड))" को प्रतिस्थापित करके यह खाली नोड्स पर काम करेगा।

2

खाली नोड्स के लिए, आप (यहाँ आप संख्या के लिए बूलियन से कलाकारों के रूप में number() करने के लिए कॉल को छोड़ सकते हैं निहित है।)

boolean(string-length($node)) 

जरूरत

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

  • कोई संबंधित समस्या नहीं^_^