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

Xslt XQuery将节点附加到现有节点集,xslt,weblogic,xquery,Xslt,Weblogic,Xquery,我不熟悉XQuery和XSLT。WebLogic正在使用XQuery 1.0 我有一个WebLogic组合和一个节点集合,只想在XQuery分配中向现有节点集添加一个节点。我目前的解决方案似乎太重了。我将处理数以万计的记录,在我看来,应该有一种非常简单的方法,只需在另一个节点下插入一个节点并返回它 declare function local:func($svdPpl as element() (:: element(*, sv:svdPpl) ::),

我不熟悉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>
};
声明函数local:func($svdPpl as element()(::element(*,sv:svdPpl):),
$svdPsn作为元素()(::元素(*,sv:svdPsn):)
as element()(::element(*,sv:svdPpl):){
{for$svdPpl中的$psn返回$psn}{$svdPsn}
};
如果我正确理解XQuery,这意味着数百万个循环只是为了向现有节点集添加记录。我尝试将insert节点$svdPsn使用到$svdPpl语法中,但这会导致WebLogic编辑器中出现验证错误


非常感谢您的帮助。

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

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

如果做不到这一点,一种常见的模式是编写一个通用的递归
typeswitch
函数,该函数遍历树并在生成输入的修改副本时应用转换逻辑。这就是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:addafter($xml,xs:QName('y'),)
元素之后添加有效负载:

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


据我所知,XQuery 1.0是一种对节点序列和原子值进行操作的声明性语言,它根本没有循环。节点集是XSLT和XPath 1.0的一个术语。是否要将一个元素节点添加为另一个元素节点的子节点?您的XML输入看起来如何,您想要添加的XML如何,这是您想要的结果?@MartinHonnen XQuery通常不被认为是声明性的。有循环和条件句。从技术上讲,它被定义为一种查询语言,非常类似于一种函数式语言,尤其是XQuery 3.0,它引入了更高阶的函数。@wst将
声明性
列为该语言的范例之一,并说“常见的声明性语言包括数据库查询语言(例如SQL、XQuery)”。我能找到的XQuery1.0规范中“loop”一词的唯一用法是在注释中。在我看来,flower表达式不是一个循环。@martinhonnenwikipedia对声明式编程的定义非常广泛。您可以并且通常可以在XQuery中控制程序流,这就是为什么我认为这种关联是不正确的。XQuery在规范中将自己定义为一种查询语言。谢谢,这正是我想要的。