如何使用XQuery更改XML结构

时间:2013-12-23 06:09:31

标签: xquery basex

我有一个包含Employees Name的XML文件和由他们完成的Job。 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完成此操作?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

对字符串进行标记可能更容易,更快捷。 tokenize($string, $pattern)使用正则表达式$string拆分$patternhead($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 }
  }
}