给定一系列XML路径,生成XML树结构

时间:2016-10-27 23:50:30

标签: xml xpath marklogic

我想解决一个问题 - 给定一个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中做到这一点的好例子?

由于

1 个答案:

答案 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"))