【问题标题】:XQuery get distinct valuesXQuery 获得不同的值
【发布时间】:2021-05-31 03:56:17
【问题描述】:

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

我有这个包含 program 的多个元素的 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 之类的事情来返回频道属性,但事实并非如此。

【问题讨论】:

  • 是 XBase 还是 BaseX?
  • @ChristianGrün 我的错,BaseX 是正确的
  • 我仍然需要了解您希望如何处理不同的结果。例如,如果 3 个带有 Anna-Karin Larsson 的程序中有 2 个具有频道 132,那么结果应该如何?如果您添加一个完整的输入示例(可能最小化,即没有无助于理解的元素,但有超过 1 个程序元素)和您的问题的预期结果,这可能会有所帮助。提前致谢。
  • 很高兴看到 Yitzhak Khabinsky 可以提供帮助。
  • @ChristianGrün 很抱歉,我对此有点着急,所以忘记了您的评论。非常感谢您的时间和帮助。我肯定会在下一个问题上跟进这个问题!

标签: xml xpath xquery basex


【解决方案1】:

请尝试以下解决方案。我正在使用 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>

输出

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

【讨论】:

  • 谢谢你,这正是我想要的
  • @forsb,很高兴听到建议的解决方案对您有用。请不要忘记将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 2015-06-17
  • 2012-09-23
相关资源
最近更新 更多