2009-06-08 4 views
6

सभी महान उत्तरों! लेकिन सवाल शोधन हकदार ...नेस्टेड XPath भविष्यवाणियों के साथ काम करना ... परिष्कृत

मैं निम्न नमूना एक्सएमएल मिल गया है ...

<objects> 
    <object objectId="1123" ... /> 
    <properties refObjectId="1123" ... /> 
    <properties refObjectId="1123" refPropertyId="2311" ... /> 
    <properties refObjectId="1123" refPropertyId="4611" ... /> 
    <object objectId="2123" ... /> 
    <properties refObjectId="2123" refPropertyId="4311" ... /> 
    <properties refObjectId="2123" refPropertyId="8611" ... /> 
    .... 
</objects> 

... और निम्नलिखित XPath क्वेरी ...

//object[//properties[@[email protected] and not(@refPropertyId)]] 

मैंने सोचा यह क्वेरी नोड्स लौटाएगी जहां properties नोड है जिसमें refObjectId विशेषता है जो objectIdobject नोड की विशेषता है और कोई 'refPropertyId' attri नहीं है Bute ... अर्थात् ऑब्जेक्ट 1123 केवल, 2123 ऑब्जेक्ट नहीं ... लेकिन यह नहीं है। ऐसा लगता है कि नेस्टेड भविष्यवाणी में object नोड की विशेषता का संदर्भ नहीं देता है।

कोई विचार? मुझे पता है कि एक्सएमएल संरचना को नेस्टेड नहीं किया गया है जैसा कि आप उम्मीद करेंगे, लेकिन इस संरचना के कारण हैं।

+0

क्या आपके पास ऑब्जेक्ट नोड के भीतर एकाधिक ऑब्जेक्ट नोड्स हैं जहां किसी विशेष ऑब्जेक्ट के गुण गुण वस्तु से नीचे होते हैं? –

उत्तर

7

आम तौर पर आपको // का उपयोग करने से बचना चाहिए जहां आप कर सकते हैं। मैं अलग ढंग से व्यक्त करने पर विचार करेंगे:

//object[../properties/@[email protected]] 

प्रदान की अभिव्यक्ति में, अपने नेस्टेड विधेय वास्तव में के लिए

//properties/@refObjectId=//properties/@objectId 

जो में से कोई भी नहीं है जाँच कर रहा है।

मुझे आशा है कि इससे मदद मिलती है!

संपादित करें: चूंकि प्रश्न यहां अपडेट किया गया है, एक अपडेटेड प्रतिक्रिया है: आपने कहा "ऐसा लगता है कि नेस्टेड भविष्य में @objectId ऑब्जेक्ट नोड के ऑब्जेक्ट आईडी विशेषता का संदर्भ नहीं देता है।" आप बिल्कुल सही कह रहे है! तो चलो इसे ठीक करें !!

//object[../properties[not(@refPropertyId)]/@[email protected]] 

यह आपके बाद के होने के करीब होना चाहिए!

+1

नाइस XPath, Jweede। –

0

इस प्रयास करें:

//objects[object/@objectId = properties/@refObjectId]/object 
0

यह काम करना चाहिए:

//objects/object[@objectId = ../properties/@refObjectId] 

मुझे यकीन है कि कैसे अपने xml है नहीं कर रहा हूँ। हालांकि, अगर यह निम्न स्वरूप में है:

<objects> 
    <object objectId="1111" /> 
    <properties refObjectId="1111" /> 
    <object objectId="2111" /> 
    <properties refObjectId="3111" /> 
    <object objectId="4111" /> 
    <properties refObjectId="5111" /> 
    <object objectId="6111" /> 
    <properties refObjectId="4111" /> 
    <object objectId="7111" /> 
    <properties refObjectId="7111" /> 
</objects> 

तो फिर तुम केवल 1111 और 7111. वस्तुओं को पाने के लिए निम्नलिखित xpath का उपयोग करना चाहिए परिणाम 4111 शामिल नहीं होना चाहिए क्योंकि गुण जहां refObjectId = 4111 तुरंत पालन नहीं करता है ऑब्जेक्ट जिसका ऑब्जेक्ट आईडी = 4111।

//objects/properties[@refObjectId = preceding::object[1]/@objectId]/preceding::object[1] 
0

यह मानते हुए कि सभी <properties> नोड्स कि किसी दिए गए <object> के हैं वास्तव में कि वस्तु का पालन करें (अपने इनपुट संकेत देने वाले करने लगता है), तो आप कर सकता है:

/objects/properties[ 
    @refObjectId = preceding-sibling::object[1]/@objectId 
    and 
    not(@refPropertyId) 
]/preceding-sibling::object[1] 

यह बहुत अच्छी तरह से करना चाहिए।

आप XSLT में हो रहे हैं तो चीजें बहुत आसान मिलती है:

<xsl:key name="kPropertiesByObjectId" match="properties" use="@refObjectId" /> 

और

<xsl:template match="object"> 
    <!-- This tests for an empty node-set. Non-empty node sets can only happen 
     for objects with at least one <properties> node without @refPropertyId --> 
    <xsl:if test="key('kPropertiesByObjectId', @objectId)[not(@refPropertyId)]"> 
    <xsl:copy-of select="." /> 
    </xsl:if> 
</xsl:template> 

XSLT मामले में, वस्तु और proerties नोड्स के क्रम अप्रासंगिक हो जाता है।

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