我们如何使用/(斜杠)分隔的路径使用xquery动态创建嵌套元素。
例如,
如果XML类似于以下结构
<Document> <Header> <Body> </Body> </Header> </Document>
如果参数是Document / Header / Footer,那么应该像下面那样创建节点。
<Document> <Header> <Body> </Body> </Header> **<Footer> </Footer>** </Document>
上面只是示例。任何人都可以帮我提供基于输入路径的通用节点创建
答案 0 :(得分:0)
将路径标记为一系列字符串。同时遍历输入XML树和路径树。如果路径在任何时候与源树不同,请创建与剩余路径匹配的新子树:
declare function local:make-nested-elements(
$element-names as xs:string*
) as element()*
{
if (empty($element-names)) then ()
else element { $element-names[1] } {
local:make-nested-elements(subsequence($element-names, 2))
}
};
declare function local:add-path(
$xml as node()?,
$paths as xs:string*
) as node()
{
let $first := $paths[1]
let $rest := subsequence($paths, 2)
return
if (empty($first)) then $xml
else if ($xml instance of text()) then $xml
else if (node-name($xml) = xs:QName($first))
then element { $first } {
$xml/@*,
for $n in $xml/node()
return local:add-path($n, $rest)
}
else element { node-name($xml) } {
$xml/@*, $xml/node(),
local:make-nested-elements($paths)
}
};
<强>输入强>:
let $xml :=
<Document>
<Header>This is a Header
<Body>Body message</Body>
</Header>
</Document>
let $path := "Document/Header/Footer/keep/nesting"
return local:add-path($xml, tokenize($path, '/'))
<强>输出强>:
<Document>
<Header>This is a Header
<Body>Body message
<Footer>
<keep>
<nesting/>
</keep>
</Footer>
</Body>
</Header>
</Document>