XQuery - выводить серию HTML-элементов с разделителем - PullRequest
0 голосов
/ 06 ноября 2018

В XQuery 3.1 я создаю таблицу HTML. В одном элементе <td> я вывожу серию <a ref="">.

Итак, на данный момент это просто for:

 <td>
   {
     for $b in collection($globalvar:URIdata)/tei:TEI/tei:text//tei:seg[@type="dep_event" 
                           and @corresp = $a/data(@corresp)
                           and @xml:id != $a/data(@xml:id)] 

     order by $b/data(@xml:id)

     return <a href="{concat($globalvar:URLdoc,$b/ancestor::tei:TEI/tei:text/@xml:id)}">{$b/data(@xml:id)}</a>                        
    }
 </td>

Выводит это:

     <td>
      <a href="http://localhost:8081/exist/apps/deheresi/doc/MS609-0006">MS609-0006-8</a>
      <a href="http://localhost:8081/exist/apps/deheresi/doc/MS609-0419">MS609-0419-5</a>
      <a href="http://localhost:8081/exist/apps/deheresi/doc/MS609-0613">MS609-0613-4</a>
    </td>

Но я бы хотел вывести список <a href="">, разделенный запятыми:

     <td>
      <a href="http://localhost:8081/exist/apps/deheresi/doc/MS609-0006">MS609-0006-8</a>, 
      <a href="http://localhost:8081/exist/apps/deheresi/doc/MS609-0419">MS609-0419-5</a>, 
      <a href="http://localhost:8081/exist/apps/deheresi/doc/MS609-0613">MS609-0613-4</a>
    </td>

РЕДАКТИРОВАТЬ: ниже работает ... но не выводит результаты в нужном порядке, и я не могу заставить order by $b/data(@xml:id) работать с ним из-за проблемы "кардинальности" (которая не появилась в оригинале).

    let $coll := collection($globalvar:URIdata)/tei:TEI/tei:text//tei:seg[@type="dep_event" 
                     and @corresp = $a/data(@corresp)
                     and @xml:id != $a/data(@xml:id)] 

     let $last := count($coll)

     for $b at $position in $coll 

     return (<a href="{concat($globalvar:URLdoc,$b/ancestor::tei:TEI/tei:text/@xml:id)}">{$b/data(@xml:id)}</a>,
           if ($position ne $last) then ', ' else '')

Заранее большое спасибо за любые советы.

1 Ответ

0 голосов
/ 06 ноября 2018

Я не уверен, есть ли в XQuery общая идиома для этого, но я думаю, что с помощью

 for $b in collection($globalvar:URIdata)/tei:TEI/tei:text//tei:seg[@type="dep_event" 
                       and @corresp = $a/data(@corresp)
                       and @xml:id != $a/data(@xml:id)] 

 order by $b/data(@xml:id)
 count $p
 let $a := <a href="{concat($globalvar:URLdoc,$b/ancestor::tei:TEI/tei:text/@xml:id)}">{$b/data(@xml:id)}</a>
 return 
   if ($p > 1)
   then (',', $a)
   else $a

- это возможный способ, очень похожий на старый подход XSLT, чтобы иметь <xsl:for-each select="$nodes"><xsl:if test="position() > 1">,</xsl:if><xsl:copy-of select="."/></xsl:for-each>. Ближе к этому вы также можете попробовать

 (
 for $b in collection($globalvar:URIdata)/tei:TEI/tei:text//tei:seg[@type="dep_event" 
                       and @corresp = $a/data(@corresp)
                       and @xml:id != $a/data(@xml:id)] 

 order by $b/data(@xml:id)

 return <a href="{concat($globalvar:URLdoc,$b/ancestor::tei:TEI/tei:text/@xml:id)}">{$b/data(@xml:id)}</a>
 ) ! (if (position() > 1) then (',', .) else .)  

Это также можно записать как

 (
 for $b in collection($globalvar:URIdata)/tei:TEI/tei:text//tei:seg[@type="dep_event" 
                       and @corresp = $a/data(@corresp)
                       and @xml:id != $a/data(@xml:id)] 

 order by $b/data(@xml:id)

 return <a href="{concat($globalvar:URLdoc,$b/ancestor::tei:TEI/tei:text/@xml:id)}">{$b/data(@xml:id)}</a>
 ) ! (if (position() > 1) then ',' else (), .) 

немного ближе к вашей второй попытке.

...