我有一些XML格式如下:
<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>我想把它变成这样的东西:
<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开始,然后在父元素中添加一个类似的结构。
返回根元素及其子元素的当前代码:
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>发布于 2016-09-07 14:13:22
您可以使用递归函数这样做:
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>这将返回以下结果:
<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>https://stackoverflow.com/questions/39371668
复制相似问题