xquery-如何使用FLWOR表达式通过单个查询获取多个记录时分配一个数字(按顺序)

时间:2012-09-04 13:12:47

标签: xquery flwor

在尝试处理XML文档中的数据时,我希望使用单个FLWOR表达式获取大量记录 -​​ 我这样做是通过使用'let'子句获取数据 - 所以我有多行数据。

例如

<div id="main">
    <p> Text #1</p>
    <p> Text #2</p>
    <p> Text #3</p>
    <p> Text #4</p>
</div>

现在,我理解如何获得4'p'元素 - 但是我还想为每一行分配一个序列号 - 即。我想以这种方式获得文本 -

 <data>Text #1</data><sequence> Sequence #1</sequence>
 <data>Text #2</data><sequence> Sequence #2</sequence>
 <data>Text #3</data><sequence> Sequence #3</sequence>
 <data>Text #4</data><sequence> Sequence #4</sequence>

3 个答案:

答案 0 :(得分:0)

虽然我不完全确定<sequence/>元素的字符串值,但一个解决方案可能如下所示:

for $p in <div id="main">
  <p>Text #1</p>
  <p>Text #2</p>
  <p>Text #3</p>
  <p>Text #4</p>
</div>/p
return (
  <data>{ $p/text() }</data>,
  <sequence>Sequence { replace($p, 'Text ', '') }</sequence>
)

答案 1 :(得分:0)

您可以在 FLWOR 表达式for clause中使用at关键字:

declare variable $div :=
  <div id="main">
      <p> Text #1</p>
      <p> Text #2</p>
      <p> Text #3</p>
      <p> Text #4</p>
  </div>;

for $p at $pos in $div/p
return (
  <data>{$p/text()}</data>,
  <sequence>Sequence #{$pos}</sequence>
)

答案 2 :(得分:0)

确实有比这样做更优雅的方式....但是它有效:

let $t := <div id="main">
  <p>Text A</p>
  <p>Text B</p>
  <p>Text C</p>
  <p>Text D</p>
</div>
for $pos in $t/p/position()
let $p := $t/p[$pos]
return (
  <data>{ $p/text() }</data>,
  <sequence>Sequence { $pos }</sequence>
)