2010-06-24 10 views
6

Mam ciąg wartości. Wszyscy mogą być równi ... lub nie. Tak więc w XQuery chcę uzyskać najczęstszy element w sekwencji.Pobierz najbardziej powtarzalny element w sekwencji z 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 {} 

Nie mogę wykonać tej pracy, więc przypuszczam, że robię coś nie tak.

Z góry dziękuję za pomoc, jaką możesz mi udzielić.

+0

Dobre pytanie ponownie (+1). Odpowiedzią jest wyrażenie jedno-liniowe XPath ... postaram się, aby było jeszcze krótsze. –

Odpowiedz

6

Zastosowanie:

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] 

Update, grudzień 2015:

to zwłaszcza krótsze, choć może nie być zbyt -efficient:

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

Najkrótsza wyrażenie może być skonstruowana dla XPath 3.1:

enter image description here

I nawet krótszy i copyable - przy użyciu nazwy jednego znaku:

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

Dziękuję bardzo, myślę, że moje niedoświadczenie doprowadziło mnie do wypróbowania bardzo pokrętnego podejścia. – deb

1

Podchodzisz do tego problemu z nadmiernego imperatywnego punktu widzenia.

W XQuery można ustawić wartości zmiennych, ale nigdy nie można ich zmienić.

Prawidłowy sposób zrobić algorytm iteracyjny typu jest z funkcji rekurencyjnej:

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) 
} 

ale lepszym sposobem podejścia do problemu jest poprzez opisanie problemu w nie-iteracyjny sposób. W tym przypadku wszystkich odrębnych wartości w sekwencji chcesz ten, który pojawia się maksymalną liczbę razy jakiejkolwiek odrębnej wartości.

Poprzedniego sentance języku XQuery jest

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

Dziękuję bardzo, spróbowałem na swój sposób, a także działa. – deb