XQuery

2010-06-24 19 views
6

ile bir sırada en fazla yinelenen öğeyi alın. Bir değerler dizim var. Hepsi eşit olabilir ... ya da değil. XQuery ile sırayla en sık öğe almak istiyorum.XQuery

let $counter := 0, $index1 := 0 
for $value in $sequence 
if (count(index-of($value, $sequence))) 
then 
{ 
$counter := count(index-of($value, $sequence)) $index1 := index-of($value) 
} else {} 

Bu işi yapamıyorum, bu yüzden yanlış bir şey yapıyorum.

Bana verebileceğiniz herhangi bir yardım için şimdiden teşekkür ederiz.

+0

Yine güzel soru (+1). Ve cevap, bir XPath tek katlı ifadesi ... daha da kısaltmaya çalışacak. –

cevap

6

Kullanım olduğunu

Bu da, özellikle kısadır de olmayabilir kısa sentezleme XPath'ın 3.1 için inşa edilebilir

$pSeq[index-of($pSeq,.)[max(for $item in $pSeq return count(index-of($pSeq,$item)))]] 

: tasarruflu

enter image description here

ve daha kısa ve copyable - bir karakter adı kullanarak:

$s[index-of($s,.)[max($s ! count(index-of($s, .)))]] 
+0

Çok teşekkür ederim, deneyimsizliğimin bükümlü bir yaklaşım denememi sağladığını düşünüyorum. – deb

1

Bu sorunu çok fazla bir zorunluluk açısından yaklaşıyorsunuz.

XQuery'de değişkenlerin değerlerini ayarlayabilirsiniz, ancak bunları hiçbir zaman değiştiremezsiniz.

yinelemeli tipi algoritmalar yapmak için doğru bir şekilde özyinelemeli fonksiyonu ile:

declare funciton local:most($sequence, $index, $value, $count) 
{ 
    let $current=$sequence[$index] 
    return 
    if (empty($current)) 
    then $value 
    else 
     let $current-count = count(index-of($current, $sequence)) 
     return 
     if ($current-count > $count) 
     then local:most($sequence, $index+1, $current, $current-count) 
     else local:most($sequence, $index+1, $value, $count) 
} 

ancak sorunun yaklaşan daha iyi bir yolu yinelemeli olmayan bir şekilde sorunu tarif gereğidir. Sıranızdaki tüm farklı değerler için bu durumda, herhangi bir farklı değerin maksimum sayısını belirten birini istiyorsunuz. , Dec. 2015

for $maxFreq in 
      max(for $val in distinct-values($sequence) 
        return count(index-of($sequence, $val)) 
       ) 
    return 
     distinct-values($sequence)[count(index-of($sequence, .)) eq $maxFreq] 

Güncelleme: XQuery çevrilmiş

önceki sentance

let $max-count := max(for $value1 in distinct-values($sequence) 
         return count(index-of($sequence, $value1))) 
for $value2 in distinct-values($sequence) 
where (count(index-of($sequence, $value2)) = $max-count 
return $value2 
+0

Çok teşekkür ederim, yolunuzu denedim ve işe yarıyor. – deb

İlgili konular