0

以下是 XML 文件 -

<Info>
  <Name>
    <P1>Tomy</P1>
    <P2>John</P2>
    <R>P2</R>
  </Name>
  <Name>
    <P1>Tomy</P1>
    <P2>John</P2>
    <R>P1</R>
  </Name>
  <Name>
    <P1>Rojer</P1>
    <P2>Messi</P2>
    <R>P2</R>
  </Name>
  <Name>
    <P1>Messi</P1>
    <P2>Carl</P2>
    <R>P2</R>
  </Name>
  <Name>
    <P1>Messi</P1>
    <P2/>
    <R>P1</R>
  </Name>

</Info>

P1是 1 号球员和P22 号球员,R是比赛的结果。我想以以下格式列出玩家的姓名,并出现不同的情况。

<P>Tomy V John</P>
<P>Rojer V Messi</P>
<P>Messi V John</P>
<P>Messi</P>

以下是解决方案,它给出了所需的输出 -

let $o := doc('sam')//Name
for $x in $o
  let $p := if (string-length($x/P2/text()) > 0) then concat($x/P1/text(),' Vs. ',$x/P2/text()) else $x/P1/text()
  for $y in $p
    group by $y
    order by $y
    return <a>{$y}</a>

但是这个查询只对某些选定的记录更有效。实际上,我有 200000 多条记录,当我执行这个查询时,我得到了内存不足错误。我正在使用 BaseX 7.6。

如果我删除该group by子句,则执行没有错误,但它给出了错误的结果,即;具有重复值。我需要不同的结果。

有什么帮助吗?

4

2 回答 2

1

尝试这个

  for $x in doc('sam')//Name
  let $p := if (string-length($x/P2/text()) > 0) then concat($x/P1/text(),' Vs. ',$x/P2  /text()) else $x/P1/text()
  group by $p
  order by $p
  return <a>{$p}</a>
于 2014-03-27T05:25:50.527 回答
0

对于正在查看此问题的任何人,内存不足行为的可能解决方案也可能是包装 xml 标记以及复制与 xQuery 实现相关的新节点的特定行为,例如:

... <a>{$y}</a>

在这种情况下,这样的事情也可能是解决方案:

let $o := doc('sam')//Name
for $x in $o
  let $p := if (string-length($x/P2/text()) > 0) then concat($x/P1/text(),' Vs. ',$x/P2/text()) else $x/P1/text()
  for $y in $p
    group by $y
    order by $y
    return (# db:copynode false #) { <a>{$y}</a> }

有关更多信息,请参阅此答案: https ://stackoverflow.com/a/48887745/4825622

于 2018-08-26T15:28:52.233 回答