XQuery - 返回整个文档,而不仅仅是选择/修改的部分

时间:2015-03-11 15:55:33

标签: xml rest xpath xquery basex

我尝试对xml文档中的某些元素进行操作而不丢弃文档的其余部分。例如,使用输入

即。如果我有

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <inventory><books>2</books></inventory>
  <bookList>
    <book category="COOKING">
      <title lang="en">Everyday Italian</title>
      <stock>1</stock>
    </book>
    <book category="CHILDREN">
      <title lang="en">Harry Potter</title>
      <stock>0</stock>
    </book>
    <book category="WEB">
      <title lang="en">XQuery Kick Start</title>
      <stock>1</stock>
    </book>
    <book category="WEB">
      <title lang="en">Learning XML</title>
      <stock>0</stock>
    </book>
  </bookList>
</bookstore>

并希望只显示库存中的书籍(即)

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <inventory><books>2</books></inventory>
  <bookList>
    <book category="COOKING">
      <title lang="en">Everyday Italian</title>
      <stock>1</stock>
    </book>
    <book category="WEB">
      <title lang="en">XQuery Kick Start</title>
      <stock>1</stock>
    </book>
  </bookList>
</bookstore>

我知道我可以明确地查询文档的其他部分并将它们组合在一起,但这是一个很大的样板,并且对文档格式的更改很脆弱。是否有更好的方法?

我应该澄清一下,我想要保留的bookList部分上面的xml文件可能有未知的其他部分。换句话说,我不想说我正在制作新的<bookstore>并添加<inventory>。我宁愿说我想要包含源文档中的所有内容,但<stock>值为0的图书除外。另外,如果<bookstore>元素包含aditoinal信息,即<bookstore Name="David's Books" schema="www.bookLlist.org">等,那么同样应保留其他信息。

2 个答案:

答案 0 :(得分:1)

XQUF (the XQuery Update Facility)让这一切变得简单:

copy $c := doc('your-database')      (: select top of the document you want to return :)
modify delete node $c//book[stock=0] (: make changes you want :)
return $c                            (: return the whole document :)

copy的使用使其成为非更新表达式,因此无法修改原始数据源。

(XQUF {​​{3}};然而,并非所有XQuery引擎都支持它; BaseX是早期采用者。

答案 1 :(得分:1)

已更新以支持任意元素。

我认为这个用例非常适合vanilla XQuery:

xquery version "1.0";

let $doc := fn:doc($uri)/bookstore
return
  element bookstore {
    $doc/* except $doc/bookList,
    element bookList {
      $doc/bookList/* except
        $doc/bookList/book[xs:integer(stock) eq 0]
    }
  }

这将重建文档,除book元素之外的每个元素都stock子元素等于0

删除了现在无关的示例......