【问题标题】:Given a sequence of XML paths, generate the XML tree structure给定一系列 XML 路径,生成 XML 树结构
【发布时间】:2016-10-27 23:50:29
【问题描述】:

我想解决一个问题——给定任意的 xml 路径序列,我想生成 xml 树结构:

例如给定这个顺序:

"/person/name" "/person/address" "/person/age" "/person/parent/name" 

生成:

<person>
<name></name>
<address></address>
<parent>
<name></name>
</parent>
</person>

有谁知道如何在 xquery 和/或 XSLT 中执行此操作的好例子?

谢谢

【问题讨论】:

  • 如何向 xslt 提供输入?

标签: xml xpath marklogic


【解决方案1】:

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

【讨论】:

  • 解决方案可以在 3.1 中通过使用数组进行改进 - 允许表示嵌套序列。
  • 谢谢 Ben,这真的很好用!我也会看看迈克尔的建议。
  • Ben,当我像你所做的那样传入一个字符串时,你的函数工作正常。但是,当我尝试从我拥有的函数传递输出时,该函数以相同格式输出字符串,但出现错误:XDMP-CAST: (err:FORG0001) xs:QName($element) -- Invalid cast: "&quot ;" cast as xs:QName 如果我手动将输出作为字符串粘贴到相同的输出中,为什么从函数传递字符串时不起作用?
  • 错误信息意味着该函数正在尝试创建一个名称为引号的元素。我推断你的函数正在创建一个字符串该函数被编写为接受一个字符串序列,而不是包含一个字符串序列的字符串。
  • 即("/a/b", "/a/c"),而不是 "'/a/b', '/a/c'"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多