XQuery - 如何插入元素?

时间:2015-12-01 15:38:31

标签: 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>

我有以下代码:

for $subject in $subjects/subject
return 
     <subject id="{$subject/@id}">
          <foo/>
     </subject>

输出

<subject id="5"><foo/></subject>
<subject id="10"><foo/></subject>
<subject id="15"><foo/></subject>

但是上面的代码没有显示主题的所有属性。只有1个}}。当然,我可以继续硬编码更多属性,但如果我不知道属性名称是什么,这将无济于事。

我想要的是这样的:

id

我相信解决方案会是这样的:

<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>

我该怎么做?

2 个答案:

答案 0 :(得分:2)

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

另一种选择是XQuery Update(为了回答您的问题,在Saxon的商业版本中支持)。我不喜欢XQuery Update,除了可能在数据库环境中,但它完成了工作,有些人喜欢它。

答案 1 :(得分:1)

你走在正确的轨道上。在重写元素时,只需使用通配符属性选择器将上下文节点中的所有属性复制到新构造的元素中。

for $subject in $subjects/subject
return 
  <subject>{
      $subject/@*,
      <foo/>
  }</subject>