【问题标题】:how to change the XML structure using XQuery如何使用 XQuery 更改 XML 结构
【发布时间】:2014-01-11 08:08:33
【问题描述】:

我有一个 XML 文件,其中包含员工姓名和他们完成的工作。 XML文件的结构是-

<Employee>AAA@A#B#C#D</Employee>
<Employee>BBB@A#B#C#D</Employee>
<Employee>CCC@A#B#C#D</Employee>
<Employee>DDD@A#B#C#D</Employee>

有数千条记录,我必须将结构更改为 -

<Employee>
  <Name>AAA</Name>
  <Jobs>
   <Job>A</Job>
   <Job>B</Job>
   <Job>C</Job>
   <Job>D</Job>
  </Jobs>
</Employee>

如何在 BaseX 中使用 XQuery 完成这项工作?

【问题讨论】:

    标签: xquery basex


    【解决方案1】:

    3 个 XQuery 函数,substring-beforesubstring-aftertokenize 用于获取 所需的输出。

    substring-before 用于获取名称。

    同样,substring-after 用于获取 Job 部分。

    然后tokenize函数,用于拆分作业。

    let $data :=
      <E>
        <Employee>AAA@A#B#C#D</Employee>
        <Employee>BBB@A#B#C#D</Employee>
        <Employee>CCC@A#B#C#D</Employee>
        <Employee>DDD@A#B#C#D</Employee>
      </E>
    
    
    for $x in $data/Employee
    return 
    
    <Employee>
       {<Name>{substring-before($x,"@")}</Name>}
       {<Jobs>{
       for $tag in tokenize(substring-after($x,"@"),'#')
       return 
         <Job>{$tag}</Job>
       }</Jobs>
    }</Employee>
    

    HTH...

    【讨论】:

      【解决方案2】:

      标记字符串可能更容易和更快。 tokenize($string, $pattern) 使用正则表达式 $pattern 拆分 $stringhead($seq) 返回序列的第一个值,tail($seq) 除了第一个值之外的所有值。当然,您也可以使用位置谓词,但这些函数更易于阅读。

      for $employee in //Employee
      let $tokens := tokenize($employee, '[@#]')
      return element Employee {
        element Name { head($tokens) },
        element Jobs {
          for $job in tail($tokens)
          return element Job { $job }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-08-27
        • 1970-01-01
        • 2022-12-07
        • 1970-01-01
        • 2021-05-31
        • 1970-01-01
        • 2018-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多