以下是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号,P2
是玩家2号,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多条记录,当我执行这个查询时,我得到Out Of Memory Error。我使用的是BaseX 7.6。
如果我删除了group by
子句,则执行时没有错误,但是它给出了错误的结果,即;具有重复值。我需要不同的结果。
任何帮助?
答案 0 :(得分: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>
答案 1 :(得分: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