كيف نحسب قيم واضحة في عقدة?
-
03-07-2019 - |
سؤال
كيف نحسب قيم واضحة في عقدة في XSLT ؟
على سبيل المثال:أريد أن نحصي عدد من البلدان القائمة في بلد العقد ، في هذه الحالة ، سيكون 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>
المحلول
إذا كان لديك وثيقة كبيرة ، ربما كنت ترغب في استخدام "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))
نصائح أخرى
في XSLT 1.0 هذا ليس واضحا ، ولكن بعد أن تعطيك فكرة عن شرط:
count(//Artist_by_Country[not(Location_ID=preceding-sibling::Artist_by_Country/Location_ID)]/Location_ID)
والمزيد من العناصر في XML يعد هذا يأخذ ، كما يتحقق في كل واحد السابقة الأخوة من كل عنصر واحد.
محاولة شيء من هذا القبيل:
count(//Country[not(following::Country/text() = text())])
"أعطني عدد كل بلد العقد دون التالية البلد مع مطابقة النص"
بت مثيرة للاهتمام من هذا التعبير ، المنظمة البحرية الدولية ، التالية محور.
ربما يمكن أيضا إزالة أول /text()
, و محل ثاني مع .
إذا كان لديك السيطرة xml الجيل الأول قوع بلد يمكن إضافة سمة إلى البلاد عقدة مثل متميزة='true' علم البلاد "تستخدم" وليس في وقت لاحق إضافة متميزة السمة إذا كنت تأتي عبر هذا البلد مرة أخرى.
ثم يمكن أن تفعل
<xsl:for-each select="Artists_by_Countries/Artist_by_Country/Country[@distinct='true']" />