Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用XQuery更改XML结构_Xquery_Basex - Fatal编程技术网

如何使用XQuery更改XML结构

如何使用XQuery更改XML结构,xquery,basex,Xquery,Basex,我有一个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> AAA@A#B#C#D BBB@A#B#C#D CCC@A#

我有一个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>
AAA@A#B#C#D
BBB@A#B#C#D
CCC@A#B#C#D
DDD@A#B#C#D
有成千上万的记录,我必须改变结构以-

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

AAA
A.
B
C
D

如何在BaseX中使用XQuery实现这一点?

3个XQuery函数、前
子字符串、后
子字符串和
标记化
用于获取 所需的输出

前面的子字符串
用于获取名称

类似地,
之后的
子字符串用于获取作业部分

然后使用
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>
let$data:=
AAA@A#B#C#D
BBB@A#B#C#D
CCC@A#B#C#D
DDD@A#B#C#D
对于$x,单位为$data/员工
返回
{{($x,“@”)}之前的子字符串
{{
对于标记化中的$tag(在($x,“@”)、“#”之后的子字符串)
返回
{$tag}
}
}

HTH…

将字符串标记化可能更容易、更快
tokenize($string,$pattern)
使用正则表达式拆分
$string
head($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 }
  }
}