2008-09-30 11 views
10

एक्सएसएलटी में नोड में अलग-अलग मानों की गणना कैसे करें?नोड में अलग-अलग मानों को कैसे गिनना है?

उदाहरण: मैं देश नोड्स में मौजूदा देशों की संख्या की गणना करना चाहते हैं, इस मामले में, यह होगा 3.

<Artists_by_Countries> 
    <Artist_by_Country> 
     <Location_ID>62</Location_ID> 
     <Artist_ID>212</Artist_ID> 
     <Country>Argentina</Country> 
    </Artist_by_Country> 
    <Artist_by_Country> 
     <Location_ID>4</Location_ID> 
     <Artist_ID>108</Artist_ID> 
     <Country>Australia</Country> 
    </Artist_by_Country> 
    <Artist_by_Country> 
     <Location_ID>4</Location_ID> 
     <Artist_ID>111</Artist_ID> 
     <Country>Australia</Country> 
    </Artist_by_Country> 
    <Artist_by_Country> 
     <Location_ID>12</Location_ID> 
     <Artist_ID>78</Artist_ID> 
     <Country>Germany</Country> 
    </Artist_by_Country> 
</Artists_by_Countries> 

उत्तर

24

कर सकता है, तो आप शायद "Muenchian विधि", जो आमतौर पर समूह के लिए प्रयोग किया जाता है का उपयोग करने के, अलग नोड्स की पहचान करना चाहते हैं।

<xsl:key name="artists-by-country" match="Artist_by_Country" use="Country" /> 

तो आप उपयोग कर <Artist_by_Country> तत्वों है कि अलग देशों प्राप्त कर सकते हैं:

/Artists_by_Countries 
    /Artist_by_Country 
    [generate-id(.) = 
    generate-id(key('artists-by-country', Country)[1])] 

और आप उन्हें भरोसा कर सकते हैं एक महत्वपूर्ण यह है कि अनुक्रमित चीजें आप मान जो अलग हैं द्वारा गणना करना चाहते हैं घोषित count() फ़ंक्शन पर कॉल में लपेटकर।

XSLT 2.0 में बेशक

, यह उतना ही आसान

रूप
count(distinct-values(/Artists_by_Countries/Artist_by_Country/Country)) 
+0

मेरी आंखें लाइनों के शीर्ष गुच्छा पर चमक रही थीं तो मुझे अंत में गले लग गए –

3

कुछ इस तरह का प्रयास करें:

count(//Country[not(following::Country/text() = text())]) 

"मुझे दे दो निम्नलिखित देश के बिना सभी देश नोड्स की गिनती "

उस अभिव्यक्ति का दिलचस्प बिट, आईएमओ following धुरी है।

आप शायद भी पहली /text() को दूर कर सकता है, और .

+0

यह केवल तभी कार्य करेगा नोड्स हल कर रहे हैं और इस तरह देश के मूल्यों इसलिए लगातार कर रहे हैं है। – dacracot

+3

नहीं, यह हमेशा काम करेगा। निम्नलिखित :: पूरे दस्तावेज़ पर काम करता है, यदि किसी भी देश के संदर्भ के बाद कोई भी देश है, तो उस नोड की गणना नहीं की जाएगी। –

+0

यह स्वीकार्य उत्तर होना चाहिए, हालांकि 2.0 विकल्प उन लोगों के लिए बहुत अच्छा है जो इसका उपयोग कर सकते हैं। – Moss

6

के साथ दूसरे की जगह XSLT 1.0 में यह स्पष्ट नहीं है, लेकिन निम्न आप आवश्यकता की एक विचार देना चाहिए:

count(//Artist_by_Country[not(Location_ID=preceding-sibling::Artist_by_Country/Location_ID)]/Location_ID) 

आपके एक्सएमएल में जितना अधिक तत्व लेता है, उतना ही यह प्रत्येक तत्व के प्रत्येक पूर्ववर्ती भाई की जांच करता है।

+0

प्रदर्शन के बारे में निश्चित नहीं है, लेकिन एक्सएसएलटी 1.0 के लिए, यह शीर्ष मतदान समाधान में तत्व की आवश्यकता के मुकाबले एक क्लीनर समाधान की तरह लगता है। –

+0

एक्सएसएलटी में एक बिल्ली को त्वचा के लिए आमतौर पर कम से कम दो तरीके होते हैं - और जो सर्वोत्तम है, वह आपकी विशेष परिस्थितियों पर निर्भर करेगा। xsl: बड़े दस्तावेज़ों पर कुंजी एक अच्छे प्रोसेसर में बहुत तेजी से हो सकती है, मेरी उपरोक्त विधि की तुलना में मुझे संदेह है। – samjudson

0

यदि आपके देश के पहले अवसर पर एक्सएमएल पीढ़ी का नियंत्रण है तो आप देश के नोड में एक विशेषता जोड़ सकते हैं जैसे विशिष्ट = 'सत्य' देश को "इस्तेमाल" के रूप में ध्वजांकित करता है और बाद में विशिष्ट विशेषता नहीं जोड़ता है आप फिर से उस देश में आते हैं।

आप एक बड़े दस्तावेज़ है, तो फिर आप

<xsl:for-each select="Artists_by_Countries/Artist_by_Country/Country[@distinct='true']" /> 
संबंधित मुद्दे