首页 > 解决方案 > 有没有办法让 xquery for...in 循环来评估由另一个函数动态创建为字符串的 xquery?

问题描述

我有一个 xquery 函数,它使用 concat() 将 xquery 作为字符串动态构建并返回该字符串。查询输出在执行时将返回一系列行。我希望能够将此函数的输出作为 for..in 循环的输入执行,该循环将遍历行并产生最终输出。我不知道如何让 for..in 循环执行第一个查询的字符串输出。我正在使用 xbase,如果可能的话,我想要一个通用的解决方案。

我试图找到一个评估或执行函数来执行字符串,类似于 SQL 的 exec() 命令,并且只找到了 xhive:evaluate()。我找不到它的代码(它可能是专有的)或“xhive:”引用的库,所以我无法导入它。

第一个查询如下所示:

declare function ps:searchQuery() as xs:string
{
if ($aliasin) then  
   concat (
      'for $app in /CE/APP/ROW ',
      'for $e in /CE/ENTITY/ROW[id = $app/entity] ',
      iau:where( iau:textEq( '$app/alias',$aliasin)),
     ' return <row> { $app/entity } { $e/name } { $app/alias } { $app/backup_alias } { $app/approval_order } {$app/buyer} </row> ') 
        else ()
};

我想像这样使用它:

    let $rows :=  
     for $urow in somenamespace:evaluate(ps:searchQuery())    
         let ...
    return
        <row id="{string($AliasName)}"> ...
        </row>

有没有办法像这样普遍评估?

最终输出将是 searchQuery() 返回的行正确格式化和重命名,这没问题。但是要执行的字符串是。

标签: xquery

解决方案


对此没有标准功能,但许多 XQuery 处理器都有某种扩展可以做到这一点。例如,在 Saxon 中,您可以使用saxon:compile-query()来准备查询并saxon:query()执行它。


推荐阅读