XQuery将节点附加到现有节点集

时间:2015-10-30 16:34:15

标签: xslt weblogic xquery

我是使用XQuery和XSLT的新手。 WebLogic正在使用XQuery 1.0。

我有一个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编辑器中出现验证错误。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

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

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

如果不这样做,一个常见的模式是编写一个通用的递归@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout_file); if (savedInstanceState == null) { // do fragment transactions here } } 函数,该函数遍历树并在生成输入的修改副本时应用转换逻辑。这就是XSLT中隐式工作的方式。从你的问题中确切地知道如何实现它,但仅作为一个例子:

typeswitch

给定XML节点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

您可以使用上述函数<x> <y> <z></z> </y> </x> local:add-after($xml, xs:QName('y'), <payload/>)元素之后添加有效内容:

<y>