xqueryexist-db

Loop in XQuery repeats results several times


I have a function which returns paragraphs from the text. So I'm comparing the <anchor> tag's attribute number(@n) to the <notes> tag's attribute number, if it's the same I want to print it with the tooltip if not I just want to print out the paragraph.

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>
    
};

In <notes> I have three notes and when it loops over the notes, each paragraph is returned three times.

How can I change it so it returns the paragraphs only one time?

I am using xquery version "3.1";


Solution

  • Inside the for loop on the $ab, let a variable for the $note and select notes that have @n attribute values that match the $ab, then if there is a matching $note, use it, else return the <p> using just the $ab:

    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>  
    

    With this input:

    <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>
    

    the code above produces this output:

    <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>