2015-10-30 80 views
0

我是使用XQuery和XSLT的新手。 WebLogic正在使用XQuery 1.0。将节点追加到现有节点集的XQuery

我有一个WebLogic组合,我有一个节点的集合,只是想添加一个节点到XQuery分配中的现有节点集。我目前的解决方案似乎太重量级了。我将处理数以万计的记录,在我看来,应该有一种非常简单的方法,只需将节点插入另一个节点下并将其返回即可。

declare function local:func($svdPpl as element() (:: element(*, sv:svdPpl) ::), 
          $svdPsn as element() (:: element(*, sv:svdPsn) ::)) 
          as element() (:: element(*, sv:svdPpl) ::) { 
    <sv:svdPpl> 
    {for $psn in $svdPpl return $psn} {$svdPsn} 
    </sv:svdPpl> 
}; 

如果我正确理解XQuery,这意味着数百万个循环只是为了向现有节点集添加记录。我曾尝试将插入节点$ svdPsn用于$ svdPpl语法,但是这导致了WebLogic编辑器中的验证错误。

任何帮助表示赞赏。

+0

以我理解的XQuery 1.0是,在节点和原子VALU的序列进行操作的声明性语言es,它根本没有回路。而节点集是XSLT和XPath 1.0的术语。你想添加一个元素节点作为另一个元素节点的子节点吗?你的XML输入如何看,你想添加的XML,这是你想要的结果? –

+0

@MartinHonnen XQuery通常不被视为声明式。有循环和条件。技术上定义为查询语言,它非常类似于函数式语言,但特别是引入更高阶函数的XQuery 3.0。 – wst

+0

@wst,那么,https://en.wikipedia.org/wiki/XQuery将'declarative'列为语言范例之一,并且https://en.wikipedia.org/wiki/Declarative_programming表示“常用的声明性语言包括那些数据库查询语言(例如,SQL,XQuery)“。我可以在XQuery 1.0规范中找到唯一使用“loop”这个词的评论。在我看来,FLOWR表达式不是一个循环。 –

回答

2

XQuery是一种功能语言,变量是不可变的。一旦使用标准XQuery进行赋值,就无法更改变量的值。

XQuery有一个扩展,允许更新名为XQuery Update Facility,但并非所有处理器都实现它。我对WebLogic并不熟悉,但看起来有些版本支持它。那将是直接路线。

如果做不到这一点,一种常见的模式是编写一个通用的递归函数,该函数遍历树并应用转换逻辑,因为它会生成输入的修改副本。这是XSLT中隐含的工作原理。这是从你的问题不清楚究竟如何,将实施,但只是作为一个例子:

declare function local:add-after(
    $context as item(), 
    $target-name as xs:QName, 
    $payload as item()* 
) as item()* 
{ 
    typeswitch ($context) 
    case element() return (
    element { node-name($context) } { 
     $context/@*, 
     for $n in $context/node() 
     return local:add-after($n, $target-name, $payload) 
    }, 
    if (node-name($context) = $target-name) 
    then $payload 
    else()) 
    default return $context 
}; 

给定一个XML节点$xml与值:

<x> 
    <y> 
    <z></z> 
    </y> 
</x> 

你可以使用上述功能local:add-after($xml, xs:QName('y'), <payload/>)到所述<y>元件之后添加的有效载荷:

<x> 
    <y> 
    <z></z> 
    </y> 
    <payload></payload> 
</x> 
+0

谢谢,那就是我一直在寻找的。 – shinds