【问题标题】:Loop in XQuery repeats results several timesXQuery 中的循环多次重复结果
【发布时间】:2021-07-23 11:35:36
【问题描述】:

我有一个从文本中返回段落的函数。因此,我将<anchor> 标签的属性编号(@n)与<notes> 标签的属性编号进行比较,如果相同,我想用工具提示打印它,如果不是,我只想打印出段落。

declare function letter:text_trans($node as node(), $model as map(*))
{
    let $resource := collection('/db/apps/Tobi-oshki/data')
    for $ab in $resource//tei:div[@type="translation"]/tei:ab
    for $note in $resource//tei:div[@type="notes"]/tei:note
    return
        if (data($note/@n) eq data($ab/tei:anchor/@n))
        then
          <div class="tooltip">{$ab}
            <span class="tooltiptext"> {data($note/@n)}.{$note}</span>
          </div>
        else
          <p> {$ab} </p>
    
};

&lt;notes&gt; 中,我有三个注释,当它在注释上循环时,每个段落都会返回三次。

如何更改它以便它只返回一次段落?

我正在使用xquery version "3.1";

【问题讨论】:

  • 我在提供的脚本中没有看到对&lt;notes&gt; 节点的引用(似乎对原始问题的一些编辑使得在这方面不太清楚@mads-hansen)。虽然我们可以看到您的输入 XML 可能很复杂,但如果没有输入的最小示例,很难正确解决您的问题。

标签: xquery exist-db


【解决方案1】:

$ab 的for 循环中,为$note 设置一个变量并选择具有与$ab 匹配的@n 属性值的注释,然后如果有匹配的$note,则使用它,否则只使用$ab 返回&lt;p&gt;

let $resource := collection('/db/apps/Tobi-oshki/data')
for $ab in $resource//tei:div[@type="translation"]/tei:ab
let $note := $resource//tei:div[@type="notes"]/tei:note[@n = $ab/tei:anchor/@n]
return
    if ($note)
    then
      <div class="tooltip">{$ab}
        <span class="tooltiptext"> {data($note/@n)}.{$note}</span>
      </div>
    else
      <p> {$ab} </p>  

有了这个输入:

<tei:doc>
  <tei:div type="notes">
    <tei:note n="1">note1</tei:note>
    <tei:note n="2">note2</tei:note>
  </tei:div>
  <tei:div type="translation">
    <tei:ab><tei:anchor n="1">translated note1</tei:anchor></tei:ab>
    <tei:ab><tei:anchor n="3">translated note3</tei:anchor></tei:ab>
  </tei:div>
</tei:doc>

上面的代码产生这个输出:

<div class="tooltip">
  <tei:ab xmlns:tei="tei">
    <tei:anchor n="1">translated note1</tei:anchor>
  </tei:ab>
  <span class="tooltiptext">1.<tei:note n="1" xmlns:tei="tei">note1</tei:note>
  </span>
</div>
<p>
  <tei:ab xmlns:tei="tei"><tei:anchor n="3">translated note3</tei:anchor></tei:ab>
</p>

【讨论】:

  • 您好,谢谢您的回答,最后我需要返回的不是$note,而是没有注释的$ab(段落),在我的情况下我有5个段落,第3个和 5th 有笔记,其他人没有,所以我需要全部归还,但有笔记的需要与工具提示一起返回。我使用了你的方式并添加了:&lt;p&gt;{ for $mb in $resource//tei:div[@type="translation"]/tei:ab return if (data($note/@n) ne data($mb/tei:anchor/@n)) then " " else &lt;p&gt; {$mb} &lt;/p&gt; } &lt;/p&gt; 但它打印出了像 3,5,1,2,4 这样的段落
  • 所以,如果@n 匹配tei:note,您想返回每个tei:ab 并有条件地提供工具提示?如果您可以提供样本数据和预期输出,那么提供帮助会容易得多,从而减少猜测和误解的机会
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
相关资源
最近更新 更多