首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Xquery从平面XML创建XML树

用Xquery从平面XML创建XML树
EN

Stack Overflow用户
提问于 2016-09-07 13:46:35
回答 1查看 122关注 0票数 1

我有一些XML格式如下:

代码语言:javascript
运行
复制
<data>
   <row>
      <id>1</id>
      <parent_id/>
   </row>
    <row>
      <id>2</id>
      <parent_id>1</parent_id>
   </row>
    <row>
      <id>3</id>
      <parent_id>1</parent_id>
   </row>
    <row>
      <id>4</id>
      <parent_id>5</parent_id>
   </row>
    <row>
      <id>5</id>
      <parent_id/>
   </row>
   <row>
      <id>6</id>
      <parent_id>2</parent_id>
   </row>
   <row>
      <id>7</id>
      <parent_id>4</parent_id>
   </row>
</data>

我想把它变成这样的东西:

代码语言:javascript
运行
复制
<data>
  <row>
    <id>1</id>
    <children>
      <row>
         <id>2</id>
         <parent_id>1</parent_id>
         <children>
            <id>6</id>
            <parent_id>2</parent_id>
            <children/>
         </children>
      </row>
      <row>
         <id>3</id>
         <parent_id>1</parent_id>
         <children/>
      </row>
    </children>
    <parent_id/>
  </row>
  <row>
     <id>5</id>
     <parent_id/>
     <children>
       <row>         
          <id>4</id>
          <parent_id>5</parent_id>
          <children>
             <row>
              <id>7</id>
              <parent_id>4</parent_id>
              <children/>
             </row>
          </children>
       </row>
     </children>
  </row>
</data>

如果有多个根节点(没有父节点),我想将这个只有父if的平面数据排序到多个树中。下面的所有子元素都将递归地添加到其父元素的<children>元素中。

我对Xquery非常陌生,因此在如何处理这种递归方面需要一些帮助。我已经成功地产生了根级和第二级,但是我应该如何恢复这一点,并考虑到每个子级别都可以通过多条路径?作为一种奖励,我还会对如何做相反的事情感兴趣:从leafs开始,然后在父元素中添加一个类似的结构。

返回根元素及其子元素的当前代码:

代码语言:javascript
运行
复制
declare function local:root() {
   let $root := doc("source.xml")/Result/Rows/Row[parent_object_id = '']
   return $root
};

declare function local:recurse($input) { let 
  $children := doc("source.xml")/Result/Rows/Row[parent_object_id =   $input/object_id]
   return $children
};

<result>
   <object_id>{local:root()/object_id/text()}</object_id>
   <parent_object_id>{local:root()/parent_object_id/text()}   </parent_object_id>
   <children>{local:recurse(local:root())}</children>
</result>
EN

Stack Overflow用户

回答已采纳

发布于 2016-09-07 14:13:22

您可以使用递归函数这样做:

代码语言:javascript
运行
复制
declare function local:nest-children($data, $id) {
  <row>{
    $id,
    <children>{
      for $child in $data/row[parent_id = $id]
      return local:nest-children($data, $child/id)
    }</children>
  }</row>
};

<data>{
  for $outer in $data/row[empty(parent_id/text())]
  return local:nest-children($data, $outer/id)
}</data>

这将返回以下结果:

代码语言:javascript
运行
复制
<data>
  <row>
    <id>1</id>
    <children>
      <row>
        <id>2</id>
        <children>
          <row>
            <id>6</id>
            <children/>
          </row>
        </children>
      </row>
      <row>
        <id>3</id>
        <children/>
      </row>
    </children>
  </row>
  <row>
    <id>5</id>
    <children>
      <row>
        <id>4</id>
        <children>
          <row>
            <id>7</id>
            <children/>
          </row>
        </children>
      </row>
    </children>
  </row>
</data>
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39371668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档