Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XQuery-返回整个文档,而不仅仅是选定/修改的部分_Xml_Rest_Xpath_Xquery_Basex - Fatal编程技术网

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

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文档中的某些元素进行操作。例如,输入

i、 如果我有

<?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]
    }
  }