我想解决一个问题 - 给定一个xml路径的任意序列,我想生成xml树结构:
e.g。鉴于这个顺序:
"/person/name" "/person/address" "/person/age" "/person/parent/name"
产生
<person>
<name></name>
<address></address>
<parent>
<name></name>
</parent>
</person>
有没有人知道如何在xquery和/或XSLT中做到这一点的好例子?
由于
答案 0 :(得分:4)
这是一个递归问题。您希望一次处理所有XPath,但逐步使用它们。在每个步骤中,确定需要创建的不同元素,创建它们,然后在每个元素内,递归调用通过该新元素的所有路径的尾部上的相同函数。
declare function local:generate($paths) {
if(fn:empty($paths)) then () else
let $heads := $paths ! fn:subsequence(fn:tokenize(.,'/'),1,1)
let $tails := $paths ! fn:string-join(fn:subsequence(fn:tokenize(.,'/'),2),'/')
for $element in fn:distinct-values($heads)
return
if($element='') then local:generate($tails)
else element { xs:QName($element) } {
let $nextPaths := for $tail at $n in $tails where fn:starts-with($paths[$n],$element||'/') return $tail
return local:generate($nextPaths)
}
};
local:generate(("/person/name", "/person/address", "/person/age", "/person/parent/name"))