Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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_Xquery_Saxon_Xquery 3.0 - Fatal编程技术网

Xml XQuery-如何插入元素?

Xml XQuery-如何插入元素?,xml,xquery,saxon,xquery-3.0,Xml,Xquery,Saxon,Xquery 3.0,我有以下xml: <subjects> <subject id="5" name="Maths"/> <subject id="10" name="English" points="5"/> <subject id="15" name="Science" points="10" cats="15"/> </subjects> 我相信解决办法是这样的: <subject id="5" name="Maths"&g

我有以下xml:

<subjects>
   <subject id="5" name="Maths"/>
   <subject id="10" name="English" points="5"/>
   <subject id="15" name="Science" points="10" cats="15"/>
</subjects>
我相信解决办法是这样的:

<subject id="5" name="Maths"><foo/></subject>
<subject id="10" name="English" points="5"><foo/></subject>
<subject id="15" name="Science" points="10" cats="15"><foo/></subject>
for $subject in $subjects/subject
return 
     insert-child( <foo/>, $subject)
用于$subject中的$subject/subject
返回
插入子项(,$subject)

我该怎么做?

你的思路是对的。在重写元素时,只需使用通配符属性选择器将所有属性从上下文节点复制到新构造的元素

for $subject in $subjects/subject
return 
  <subject>{
      $subject/@*,
      <foo/>
  }</subject>
用于$subject中的$subject/subject
返回
{
$subject/@*,
}

你的思路是对的。在重写元素时,只需使用通配符属性选择器将所有属性从上下文节点复制到新构造的元素

for $subject in $subjects/subject
return 
  <subject>{
      $subject/@*,
      <foo/>
  }</subject>
用于$subject中的$subject/subject
返回
{
$subject/@*,
}

一旦您的XML源变得更加复杂,如果您的任务是对大型XML文档进行小的更改,那么我强烈建议您使用XSLT而不是XQuery。XSLT基于匹配模板规则的递归下降处理模型绝对适合此任务,如果您尝试在XQuery中执行此操作,最终会在自己的递归函数中“手动”复制此机制


另一种选择是XQuery更新(为了回答您的问题,Saxon的商业版支持XQuery更新)。我不是XQuery更新的狂热爱好者,也许除了在数据库环境中,但它可以完成这项工作,有些人喜欢它。

一旦您的XML源变得更加复杂,如果您的任务是对大型XML文档进行小的更改,那么我强烈建议使用XSLT而不是XQuery。XSLT基于匹配模板规则的递归下降处理模型绝对适合此任务,如果您尝试在XQuery中执行此操作,最终会在自己的递归函数中“手动”复制此机制


另一种选择是XQuery更新(为了回答您的问题,Saxon的商业版支持XQuery更新)。我不是XQuery更新的狂热爱好者,也许除了在数据库环境中,但它可以完成这项工作,有些人喜欢它。

XPath根本不支持插入;您所做的是XQuery,而不是XPath。我还强烈建议您阅读XQUF(XQuery更新工具)的文档。@Charles Duffy此功能仅对Saxon EE可用,因为我使用的是免费社区版(CE)我对Saxon不太熟悉——我首选的XQuery实现是BaseX——所以我不能马上说。XPath根本不支持插入;您所做的是XQuery,而不是XPath。我还强烈建议您阅读XQUF(XQuery更新工具)的文档。@Charles Duffy此功能仅对Saxon EE可用,因为我使用的是免费社区版(CE)我对Saxon不太熟悉——我首选的XQuery实现是BaseX——所以我不能马上说。据我所知,XQuery更新是自己更新组织文档的。如果我只想像我的问题中所显示的那样编辑我的输出,该怎么办?正如Kay博士所建议的那样,对于简单的任务,XQuery可能就足够了(请参阅递归
typeswitch
模式的示例),但对于复杂的规则,XSLT更适合该任务。@YahyaUddin XQuery更新包括一个副本…修改(也称为“转换”)表达式,它创建原始文档的修改副本,而不是原位更新原始文档。据我所知,XQuery update会自行更新组织文档。如果我只想像我的问题中所显示的那样编辑我的输出,该怎么办?正如Kay博士所建议的那样,对于简单的任务,XQuery可能就足够了(请参阅递归
typeswitch
模式的示例),但对于复杂的规则,XSLT更适合该任务。@YahyaUddin XQuery更新包括一个副本…修改(也称为“转换”)表达式,它创建原始文件的修改副本,而不是就地更新原始文件。
for $subject in $subjects/subject
return 
  <subject>{
      $subject/@*,
      <foo/>
  }</subject>