XQuery

2010-06-24 24 views
6

के साथ अनुक्रम में सबसे दोहराया तत्व प्राप्त करें मुझे मूल्यों का अनुक्रम मिला है। वे सभी बराबर हो सकते हैं ... या नहीं। तो XQuery के साथ मैं अनुक्रम में सबसे लगातार आइटम प्राप्त करना चाहता हूं।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 {} 

मैं यह काम नहीं कर सकता, इसलिए मुझे लगता है कि मैं कुछ गलत कर रहा हूं।

किसी भी मदद के लिए अग्रिम धन्यवाद, जो आप मुझे दे सकते हैं।

+0

अच्छा सवाल फिर से (+1)। और जवाब एक XPath एक-लाइनर अभिव्यक्ति है ... इसे कम करने की कोशिश करेगा। –

उत्तर

6

उपयोग है

यह घटना विशेष रूप में कम है, हालांकि है भी नहीं हो सकता है कुशल:

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

कम से कम अभिव्यक्ति XPath 3.1 के लिए निर्माण किया जा सकता:

enter image description here

और यहां तक ​​कि छोटे और copyable - एक चरित्र नाम का उपयोग:

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

आपको बहुत धन्यवाद, मुझे लगता है कि मेरी अनुभवहीनता ने मुझे एक बहुत ही मोड़ के दृष्टिकोण की कोशिश की थी। – deb

1

आप इस समस्या को बहुत अधिक अनिवार्य दृष्टिकोण से आ रहे हैं।

XQuery में आप चर के मान सेट कर सकते हैं, लेकिन आप उन्हें कभी नहीं बदल सकते हैं।

पुनरावृत्ति प्रकार एल्गोरिदम करने के लिए सही तरीका एक पुनरावर्ती समारोह के साथ है:

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

लेकिन समस्या आ करने का बेहतर तरीका एक गैर पुनरावृत्ति तरह से समस्या का वर्णन कर रहा है। आपके अनुक्रम में सभी विशिष्ट मानों के इस मामले में आप वह व्यक्ति चाहते हैं जो किसी भी विशिष्ट मूल्य के अधिकतम संख्या में दिखाई देता है। ,

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] 

अद्यतन दिसम्बर 2015:

पिछले sentance XQuery में अनुवाद किया

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

आपको बहुत बहुत धन्यवाद, मैंने आपके रास्ते की कोशिश की है और काम भी करता है। – deb

संबंधित मुद्दे