我尝试对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">
等,那么同样应保留其他信息。
答案 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
。
删除了现在无关的示例......