繁体   English   中英

XQuery 获得不同的值

[英]XQuery get distinct values

我是 XQuery 的新手,正在尝试学习如何将它与 BaseX 一起使用。

我有这个 xml 包含程序的多个元素:

<program id="4565">
        <name>Musiken i P3</name>
        <url>http://sverigesradio.se/sida/default.aspx?programid=4565</url>
        <editor>Anna-Karin Larsson</editor>
        <channel>164</channel>
        <category>5</category>
</program>

到目前为止,我已经理解我可以获得例如编辑器的不同值,如下所示:

let $vals := $sr/sr/programs/program/editor
let $uniqe-items := distinct-values($vals)

for $vals in $uniqe-items
    order by $vals
    return <li>{string($vals)}</li>

然而,当我这样做时,我只得到编辑的名字,我不明白我是如何检查这样的:

 let $vals := $sr/sr/programs/program/editor
 let $uniqe-items := distinct-values($vals)

 for $vals in $uniqe-items
     where $vals/channel = "132"
     order by $vals
     return <li>{string($vals)}</li>

我在想我可以做一些类似$vals/../channel的事情来回到通道属性,但似乎并非如此。

请尝试以下解决方案。 我正在使用 BaseX 9.5

distinct-values()给出一个字符串序列:Anna-Karin Larsson、Anna Karenina,而不是 XML 元素。

for子句中使用 XPath 谓词可以完全消除where子句:

for $vals in distinct-values(./programs/program[channel = "132"]/editor)

XQuery

xquery version "3.1";

declare context item := document {
<programs>
    <program id="4565">
        <name>Musiken i P3</name>
        <url>http://sverigesradio.se/sida/default.aspx?programid=4565</url>
        <editor>Anna-Karin Larsson</editor>
        <channel>164</channel>
        <category>5</category>
    </program>
    <program id="4770">
        <name>Musiken i P3</name>
        <url>http://sverigesradio.se/sida/default.aspx?programid=4565</url>
        <editor>Anna Karenina</editor>
        <channel>132</channel>
        <category>55</category>
    </program>
</programs>  
};

<ul>
{
  for $vals in distinct-values(./programs/program[channel = "132"]/editor)
  (:where ./programs/program[editor = $vals]/channel = "132":)
  order by $vals
  return <li>{data($vals)}</li>
}
</ul>

Output

<ul>
  <li>Anna Karenina</li>
</ul>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM