Xml XQuery-返回整个文档,而不仅仅是选定/修改的部分
我试图在不丢弃文档其余部分的情况下对xml文档中的某些元素进行操作。例如,输入 i、 如果我有Xml XQuery-返回整个文档,而不仅仅是选定/修改的部分,xml,rest,xpath,xquery,basex,Xml,Rest,Xpath,Xquery,Basex,我试图在不丢弃文档其余部分的情况下对xml文档中的某些元素进行操作。例如,输入 i、 如果我有 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <inventory><books>2</books></inventory> <bookList> <book category="COOKING"> <title la
<?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>
2.
日常意大利语
1.
哈利·波特
0
XQuery启动
1.
学习XML
0
只想展示库存图书(即)
2.
日常意大利语
1.
XQuery启动
1.
我知道我可以显式地查询文档的其他部分,并将它们组合在一起,但这是一个大量的样板文件,对于文档格式的更改来说很脆弱。是否有更好的方法
我应该澄清,我想保留的书目部分上方的xml文件可能还有未知的附加部分。换句话说,我不想说我正在制作一个新的
并包含
。我更愿意说,我希望包括源文档中的所有内容,但
值为0的书籍除外。此外,如果
元素包含附加信息,即
等,则应同样保留该附加信息。使这变得容易:
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
使其成为非更新表达式,因此不会修改原始数据源
(然而,并非所有的XQuery引擎都支持它;BaseX是早期采用者)。更新以支持任意元素
我认为这个用例非常适合香草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
删除现在不相关的例子 您的示例不是格式良好的XML。请编辑您的问题。谢谢Ken和Mathias,很抱歉问题太复杂,我已经更新了问题。您是对的,糟糕的xml使我的问题变得更加混乱,没有那么有用。我感谢你的反馈。顺便说一句,这个问题仍然比它需要的大得多。如果您不介意的话,我可以尝试将其简化为要点,以提供一个如何构建良好MCVE的示例(最小、完整、可验证的示例)。它将允许生成具有特定过滤器/规则的其他xml谢谢您的建议。如果我理解您的更正(我承认我可能不会),这需要我知道我的文件中的书目上方还有哪些内容。换句话说,如果我有另一组名为CDlist的元素,我必须指定它才能将其包含在输出中。(参见我对上面原始问题的粗体添加)。我用一个完全通用的解决方案更新了这个问题。注意:XQuery3.0示例不符合这些要求,而且似乎不再适合。您能否指定我基于XQUF的答案如何不符合给定的要求?(也许是对这个答案的一个评论,所以它的局限性对考虑它的人来说更明显)。对不起,我不是有意暗示的。我的意思是我的XQuery 3.0示例(
local:projection()
等)不再满足要求。为了清晰起见,我把它放了起来,但它增加了混乱,所以我把它取了下来。我看不出你基于XQUF的答案有任何问题;我只是喜欢显式转换。谢谢你的建议。我会试试看。@DavidK,我在原始答案中发现了一个小错误--//book
需要$c//book
;如果您遇到问题,请再试一次。
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]
}
}