1

我在下面有 4<e>个节点的 xml 代码,我需要创建一个 XQuery 过程,我将 2 个参数(甚至 3 个)传递给它 param1=EP, param2=PRF 并确定哪些节点<e>在 PRF 之前以 EP 顺序呈现节点。之后重印相同的结构,但节点必须有一个名为ordered的新属性,其值为yes或no<e ordered="yes">

<?xml version="1.0" encoding="UTF-8"?>
<results>
<e>
<element sign="none;isroot:yes">
    <e_afl>kamatsa</e_afl><e_asl>crawl</e_asl>
</element>
<element sign="equal">
    <e_afl>vai</e_afl><e_asl>DUR</e_asl>
</element>
<element sign="hyphen">
    <e_afl>t</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ak</e_afl><e_asl>PRF</e_asl>
</element>
<element sign="hyphen">
    <e_afl>i</e_afl><e_asl>REAL</e_asl>
</element>
<element sign="equal">
    <e_afl>na</e_afl><e_asl>1SG.O</e_asl>
</element>
</e>
<e>
<element sign="none">
    <e_afl>i</e_afl><e_asl>3m.A</e_asl>
</element>
<element sign="equal;isroot:yes">
    <e_afl>pos</e_afl><e_asl>hit</e_asl>
</element>
<element sign="hyphen">
    <e_afl>a</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>vai</e_afl><e_asl>DUR</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ve</e_afl><e_asl>FRUS</e_asl>
</element>
<element sign="hyphen">
    <e_afl>t</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ak</e_afl><e_asl>PRF</e_asl>
</element>
<element sign="hyphen">
    <e_afl>a</e_afl><e_asl>REAL</e_asl>
</element>
<element sign="equal">
    <e_afl>na</e_afl><e_asl>1SG.O</e_asl>
</element>
</e>
<e>
<element sign="none">
    <e_afl>y</e_afl><e_asl>3m.A</e_asl>
</element>
<element sign="equal;isroot:yes">
    <e_afl>aNt</e_afl><e_asl>work</e_asl>
</element>
<element sign="hyphen">
    <e_afl>vai</e_afl><e_asl>DUR</e_asl>
</element>
<element sign="hyphen">
    <e_afl>t</e_afl><e_asl>PRF</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ak</e_afl><e_asl>CAUS.SOC</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ak</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>i</e_afl><e_asl>REAL</e_asl>
</element>
<element sign="equal">
    <e_afl>ri</e_afl><e_asl>3m.O</e_asl>
</element>
</e>
<e>
<element sign="none">
    <e_afl>n</e_afl><e_asl>1SG.S</e_asl>
</element>
<element sign="equal;isroot:yes">
    <e_afl>aNt</e_afl><e_asl>work</e_asl>
</element>
<element sign="hyphen">
    <e_afl>a</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>vai</e_afl><e_asl>DUR</e_asl>
</element>
<element sign="hyphen">
    <e_afl>t</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ak</e_afl><e_asl>PRF</e_asl>
</element>
<element sign="hyphen">
    <e_afl>i</e_afl><e_asl>REAL</e_asl>
</element>
</e>
</results>
4

1 回答 1

1

BaseX 支持XQuery 更新。它还有一个很好的(目前仍然是特定于实现的,但目前 W3C 有一个问题正在等待标准化)操作符,称为update,简化了转换表达式。

请注意,您的 XML 当前格式不正确,因为 XML 文档始终只有一个根元素。如果您添加此内容,则以下内容应该有效:

for $e in doc("your-xml-file.xml")//e
return
  if ($e/element[e_asl = "EP"][following-sibling::element/e_asl = "PRF"])
  then $e update insert node (attribute {"ordered"} {"yes"}) into .
  else $e

顺便说一句,如果你想修改你原来的数据库,你可以发出以下命令

SET WRITEBACK true

(或使用命令行和-u命令启动 BaseX)并执行以下命令:

for $e in doc("e.xml")//e[element[e_asl = "EP"][following-sibling::element/e_asl = "PRF"]]
return insert node (attribute {"ordered"} {"yes"}) into $e
于 2014-05-20T20:06:16.660 回答