我想解决一个问题-给定任意顺序的xml路径,我想生成xml树结构:
例如给定以下顺序:
"/person/name" "/person/address" "/person/age" "/person/parent/name"
生成:
<person>
<name></name>
<address></address>
<parent>
<name></name>
</parent>
</person>
有谁知道如何在xquery和/或XSLT中执行此操作的好示例?
谢谢
最佳答案
这是递归问题。您想一次处理所有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"))
关于xml - 给定一系列XML路径,生成XML树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40295933/