XQuery - 带分隔符的 HTML 元素输出系列
XQuery - output series of HTML elements with separator
在 XQuery 3.1 中,我正在构造一个 HTML table。在一个 <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>
编辑:下面的工作...但没有按所需顺序输出结果,由于 "cardinality" 问题(未弹出原件)。
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 '')
非常感谢您的任何建议。
我不确定 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
是一种可能的方法,与具有 <xsl:for-each select="$nodes"><xsl:if test="position() > 1">,</xsl:if><xsl:copy-of select="."/></xsl:for-each>
的旧 XSLT 方法非常相似。接近那个你也可以尝试
(
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 (), .)
离第二次尝试更近了。
在 XQuery 3.1 中,我正在构造一个 HTML table。在一个 <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>
编辑:下面的工作...但没有按所需顺序输出结果,由于 "cardinality" 问题(未弹出原件)。
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 '')
非常感谢您的任何建议。
我不确定 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
是一种可能的方法,与具有 <xsl:for-each select="$nodes"><xsl:if test="position() > 1">,</xsl:if><xsl:copy-of select="."/></xsl:for-each>
的旧 XSLT 方法非常相似。接近那个你也可以尝试
(
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 (), .)
离第二次尝试更近了。