Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
给定一系列XML路径,生成XML树结构_Xml_Xpath_Marklogic - Fatal编程技术网

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

给定一系列XML路径,生成XML树结构,xml,xpath,marklogic,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>

我想解决一个问题—给定任意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中实现这一点的好例子吗


谢谢这是一个递归问题。你想一次处理所有的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"))

这是一个递归问题。你想一次处理所有的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"))

如何向xslt提供输入?如何向xslt提供输入?该解决方案可以在3.1中通过使用数组(允许表示嵌套序列)进行改进。感谢Ben,这非常有效!我也来看看Michael的建议。Ben,当我像你一样传入字符串时,你的函数工作得很好。但是,当我尝试传入我拥有的函数的输出时,该函数以相同的格式输出字符串,我得到一个错误:XDMP-CAST:(err:FORG0001)xs:QName($element)——无效的CAST:““强制转换为xs:QName为什么在从我的函数传递字符串时不工作?如果我手动将该输出粘贴为字符串,那么相同的输出工作?错误消息表示函数正在尝试创建一个名为引号的元素。我推断您的函数正在创建一个字符串。该函数被编写为接受一个字符串序列,而不是包含一个字符串序列的字符串。(“/a/b”、“/a/c”)、而不是“/a/b”、“/a/c””该解决方案可以在3.1中通过使用数组进行改进,数组允许表示嵌套序列。感谢Ben,这非常有效!我也来看看Michael的建议。Ben,当我像你一样传入字符串时,你的函数工作得很好。但是,当我尝试传入我拥有的函数的输出时,该函数以相同的格式输出字符串,我得到一个错误:XDMP-CAST:(err:FORG0001)xs:QName($element)——无效的CAST:““强制转换为xs:QName为什么在从我的函数传递字符串时不工作?如果我手动将该输出粘贴为字符串,那么相同的输出工作?错误消息表示函数正在尝试创建一个名为引号的元素。我推断您的函数正在创建一个字符串。该函数被编写为接受一个字符串序列,而不是包含一个字符串序列的字符串。(“/a/b”、“a/c”)而不是“/a/b”、“a/c”