2010-05-11 11 views
43

मेरे पास यह XML फ़ाइल है, जिसमें से मैं संदर्भित उपयोगकर्ताओं की संख्या को गिनना चाहता हूं। लेकिन वे एक से अधिक श्रेणियों में दिखाई दे सकते हैं, और मैं इन डुप्लिकेट को ध्यान में रखना नहीं चाहता हूं।
नीचे दिए गए उदाहरण में, क्वेरी 3 और 4 नहीं लौटाई जानी चाहिए। क्या XPath में ऐसा करने का कोई तरीका है? उपयोगकर्ताओं को बिल्कुल हल नहीं किया जाता है।एक्सपैथ में अलग?

<list> 
    <group name='QA'> 
    <user name='name1'>[email protected]</user> 
    <user name='name2'>[email protected]</user> 
    </group> 
    <group name='DEV'> 
    <user name='name3'>[email protected]</user> 
    <user name='name2'>[email protected]</user> 
    </group> 
</list> 
+1

अच्छा प्रश्न (+1) की है। शुद्ध XPath 1.0 एक-लाइनर समाधान के लिए मेरा उत्तर देखें। :) –

उत्तर

30

एक शुद्ध XPath 1.0 - एक लाइनर:

उपयोग:

count(/*/group/user[not(. = ../following-sibling::group/user)])

+0

यह केवल तभी काम करेगा यदि उपयोगकर्ता नाम हैं तो क्या यह आदेश नहीं है? यदि यह मामला है (यह देर हो चुकी है और मैं पी रहा हूं ...) आप जोड़ सकते हैं [(नहीं (। = ../following-sibling::group/user)) और (नहीं। = ../preceading -साइबलिंग :: समूह/उपयोगकर्ता))] – gingerbreadboy

+0

लेकिन यह सही है इसलिए +1 – gingerbreadboy

+0

@runrunraygun क्यों सब कुछ के बराबर नहीं है? निम्नलिखित भाई बहनों के बराबर नहीं होने के लिए परीक्षण बराबर मूल्यों के समूह से केवल एक मूल्य लेता है - वास्तव में क्या चाहता है। :) सराहना करने के लिए धन्यवाद। –

0

आपको इस तरह के दो कार्यों का उपयोग करने की आवश्यकता होगी। अपने XSL/XSLT फ़ाइल के शीर्ष पर

: आप

distinct-values(//list/group/user) 

अद्यतन का उपयोग कर सकते

count(distinct-values(//list/group/user)) 

पहले distinct मूल्यों, count उन्हें

+1

अच्छा, लेकिन क्या आपने इसका परीक्षण किया है? कृपया, सही - यह सिर्फ एक "मामूली" समस्या है। :) –

+0

हां, यह –

+2

विक्रेताओं का काम करता है: यदि "यह काम करता है" तो आपके पास एक अपूर्ण XPath 2.0 इंजन है! जाहिर है, आपने अपनी प्रस्तावित XPath अभिव्यक्ति का बिल्कुल परीक्षण नहीं किया! * संकेत 1 *: XPath में कोई 'COUNT()' फ़ंक्शन नहीं है। * संकेत 2 *: XPath केस-संवेदी है। –

13

कार्यों नाम स्थान http://www.w3.org/2005/xpath-functions का उपयोग कर पाने के तो आपके पास स्टाइलशीट तत्व होना चाहिए, उपरोक्त यूआरएल को उपसर्ग fn पर नीचे मानचित्र करें ...

<xsl:stylesheet version="1.0" 
xmlns:fn="http://www.w3.org/2005/xpath-functions" 
> 

तो आप

select="fn:distinct-values(//list/group/user)" 

इस का उपयोग कर सकते हैं कुछ xpathdocument वस्तु में टेम्पलेट्स में यह कर रहे हैं और नहीं ग्रहण करेंगे मामले inwhich तुम एक namespacemanager वर्ग का उपयोग करने की जरूरत है।

लिंक ...

XSLT: Add namespace to root element

http://www.xqueryfunctions.com/xq/fn_distinct-values.html

http://msdn.microsoft.com/en-us/library/d6730bwt(VS.80).aspx

अन्यथा Dimitre Novatchev के जवाब का प्रयास करें।

+0

ठीक है, चलिए नामस्थानों के साथ सौदा करते हैं। एर, बेहतर खुद को दबाओ। – Antoine

+2

'विशिष्ट-मान()' फ़ंक्शन केवल XPath 2.0 में लागू किया गया है और इसका मतलब केवल एक्सएसएलटी 2.0 में है। आपके उत्तर में कोड XSLT 1.0 में काम नहीं करता है। कृपया सही करें। –

+1

@ डिमिटर: ओपी ने एक्सएसएलटी 1.0 निर्दिष्ट नहीं किया है, इसलिए मुझे लगता है कि "कृपया, सही" कहने के लिए यह थोड़ा कठोर है। यह उत्तर पहले से ही सही है। –

1

में सुनिश्चित नहीं हैं XPath में यह कर सकता है, लेकिन यह System.Linq का उपयोग कर आसानी से किया जा सकता है:

string xml = "<list><group name='QA'><user name='name1'>[email protected]</user><user name='name2'>[email protected]</user></group><group name='DEV'><user name='name3'>[email protected]</user><user name='name2'>[email protected]</user></group></list>"; 
     XElement xe = XElement.Parse(xml); 
     int distinctCount = xe.Elements().Elements().Select(n => n.Value).Distinct().Count(); 

इस उदाहरण में, distinctCount बराबर होगा 3.

+0

सही लगता है, लेकिन मैं .NET ढांचे के पुराने संस्करण के साथ काम कर रहा हूं और मैं इसे आसानी से एक उत्पादन ऐप अपग्रेड नहीं कर सकता। – Antoine

+0

आह, क्षमा करें! मुझे एहसास नहीं हुआ कि आप नेट 3.5 पर नहीं थे। – JSprang

3

मैं एक बेहतर जवाब

count(//user[not(. = following::user/.)]) 
संबंधित मुद्दे