0

I have the following xml:

<subjects>
   <subject id="5" name="Maths"/>
   <subject id="10" name="English" points="5"/>
   <subject id="15" name="Science" points="10" cats="15"/>
</subjects>

and I have the following code:

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

which outputs

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

However the above code does not show all the attributes of subject. Only id. Of course I can continue hardcoding more attributes but this won't help if I don't know what the attributes names are.

What I want is something like this:

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

I believe the solution would be something like this:

for $subject in $subjects/subject
return 
     insert-child( <foo/>, $subject)

How do I do this?

4

2 回答 2

2

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

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

于 2015-12-02T09:46:42.397 回答
1

你走在正确的轨道上。在重写元素时,您可以简单地使用通配符属性选择器将所有属性从上下文节点复制到新构建的元素。

for $subject in $subjects/subject
return 
  <subject>{
      $subject/@*,
      <foo/>
  }</subject>
于 2015-12-01T16:19:54.693 回答