我是xquery的初学者,我希望你能帮我解释一下。我正在使用BaseX 7.0.1。
我有一个如下所示的dictionary.xml文件:
<doc>
<entry>
<vedette>je</vedette>
<variante>je</variante>
<variante>j'</variante>
<partiedudiscours>pronom</partiedudiscours>
</entry>
</doc>
我还有另一个malone_fr.xml文件,其中包含我要注释的文本,如下所示:
<doc>
L’Opportunité
Par : Walter Malone (1866-1915)
Ils ont mal conclu ceux qui disent que je ne reviendrai plus
Quand une fois j’ai frappé à ta porte et ne t’ai pas rencontré,
</doc>
所以我想比较&lt;的内容。 variante&gt;使用我的文本的dictionary.xml的一部分,并使用&lt;的内容标记文本。 partiedudiscours&gt;。 到目前为止,我已经能够使用此代码执行此操作:
let $comp := data(for $j in tokenize(for $i in db:open('malone_fr')/doc return $i,"\n")
return tokenize($j," "))
for $aa in $comp
return
for $lemme in db:open('dictionnaire')/doc/entry
return
let $oldName :=$aa
return
if ($oldName= $lemme/variante)
then
let $newName := element {$lemme/partiedudiscours} {$aa}
return
for $bb in $comp
return
if ($bb=$oldName)
then $newName
else ($bb)
else ()
这给了我以下结果: [第一次迭代]
L’Opportunité Par : Walter Malone (1866-1915) Ils<verbe>ont</verbe> mal conclu ceux qui disent que je ne reviendrai plus
[第二次迭代]
L’Opportunité Par : Walter Malone (1866-1915) <pronom>Ils</pronom>ont mal conclu ceux qui disent que je ne reviendrai plus
正如你所看到的,它只是通过迭代显示每个单词的结果,而我需要一个结果,整个文本注释如下:
L’Opportunité Par : Walter Malone (1866-1915) <pronom>Ils</pronom><verbe>ont</verbe> <adverbe>mal</adverbe> <verb>conclu</verb>
等。 我不知道如何处理for循环来做到这一点。
提前致谢。
答案 0 :(得分:1)
我认为你的解决方案比它需要的要复杂一些。您应该能够在一个循环中执行此操作。使用XPath执行查找 - 而不是显式循环遍历字典中的所有值 - 将允许您的数据库进行优化,以便更快地检索字典数据。
let $toks := data(
for $i in db:open('malone_fr')/doc
return tokenize($i,"\s"))
for $t in $toks
return
let $e := $dict/entry[variante = $t]
return
if ($e)
then (element { $e/partiedudiscours } { $t }, text{" "})
else ($t, text{" "})
此外,tokenize()
步骤会丢弃空格,因此输出序列中不存在空格。它只会出现间隔,因为这通常是渲染原子类型序列的默认方法;但是,正如您从测试输出中看到的那样,空间不会围绕元素呈现。在上面的解决方案中,我添加了非常基本的空间处理,因此元素也正确间隔。如果不需要,可以删除text{" "}
个节点。
更新:添加了@ DennisKnochenwefel的建议