如何使用XQuery更改XML结构
我有一个XML文件,其中包含员工姓名和他们所做的工作。 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#
<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 }
}
}