我有一个包含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完成此操作?
答案 0 :(得分:4)
3个XQuery函数,substring-before
,substring-after
和tokenize
用于获取
所需的输出。
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
拆分$pattern
,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 }
}
}