我正在嘗試遍歷專案并輸出每個專案的出現次數,但它輸出相同字典的次數等于專案數。有沒有一種與使用括號相同的方法來為 let 陳述句創建回圈。我知道 XQuery 是一種函式式語言,我可以使用 group by ,但 marklogic 不支持它。
xquery version "1.0-ml";
let $dict := map:map()
for $i in ('book1','book2','book2')
let $n := (if (map:contains($dict, $i)) then (map:get($dict, $i)) else (0))
let $dict1 := map:put($dict, $i, 1 $n)
return $dict
輸出:
<map:map>
<map:entry key="book1">
<map:value xsi:type="xs:integer">1</map:value>
</map:entry>
<map:entry key="book2">
<map:value xsi:type="xs:integer">2</map:value>
</map:entry>
</map:map>
map as
XML
<map:map>
<map:entry key="book1">
<map:value xsi:type="xs:integer">1</map:value>
</map:entry>
<map:entry key="book2">
<map:value xsi:type="xs:integer">2</map:value>
</map:entry>
</map:map>
map as
XML
<map:map>
<map:entry key="book1">
<map:value xsi:type="xs:integer">1</map:value>
</map:entry>
<map:entry key="book2">
<map:value xsi:type="xs:integer">2</map:value>
</map:entry>
</map:map>
uj5u.com熱心網友回復:
您可以let使用一次性變數,然后對該變數進行 for 回圈 FLWOR 處理,然后回傳$dict映射:
xquery version "1.0-ml";
let $dict := map:map()
let $_ :=
for $i in ('book1','book2','book2')
let $n := if (map:contains($dict, $i)) then map:get($dict, $i) else 0
return map:put($dict, $i, 1 $n)
return $dict
由于map:put()回傳一個空序列,您還可以回傳一個帶有 for 回圈處理的序列,然后是$dict:
xquery version "1.0-ml";
let $dict := map:map()
return (
for $i in ('book1','book2','book2')
let $n := if (map:contains($dict, $i)) then map:get($dict, $i) else 0
return map:put($dict, $i, 1 $n),
$dict
)
相同處理的更簡潔版本:
xquery version "1.0-ml";
let $dict := map:map()
let $_ := ('book1','book2','book2') ! map:put($dict, ., 1 head((map:get($dict, .), 0)))
return $dict
uj5u.com熱心網友回復:
除了@MadsHansen 的答案,您還可以使用更多功能:
xquery version "1.0-ml";
let $dict := map:map()
let $myvalues := ('book1','book2','book2')
let $_ :=
for $i in fn:distinct-values($myvalues)
return map:put($dict, $i, count(index-of($i, $myvalues)))
return $dict
(我從堆疊溢位的count另一個答案中選擇了“頻率”函式)index-of
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/456001.html
上一篇:在JS中使用地圖迭代JSON字串
下一篇:如何添加資料框字典的列?
