我有一组XQuery函数,表示可以执行以转换数据值的各种操作。每个函数都将获取一个值,以及转换所需的一些参数。计划是执行一系列嵌套函数调用来计算最终值。这个想法是这些管道将被配置,然后在执行之前保持不变,因为将使用不同的起始值重复调用相同的函数管道。因此,我们的想法是将调用堆栈表示为一系列嵌套的XML元素,即
<mylib:escape>
<value>
<mylib:select>
<config>
<index>2</index>
</config>
<value>
<mylib:tokenize>
<config>
<delimiter>,</delimiter>
</config>
<value>
$starting-value
</value>
</mylib:tokenize>
</value>
</mylib:select>
</value>
</mylib:escape>
在mylib模块命名空间中,我会有函数:
declare function mylib:tokenize($value as xs:string, $delimiter as xs:string) as xs:string
{ ... }
declare function mylib:select($value as xs:string, $index as xs:int) as xs:string
{ ... }
declare function mylib:escape($value as xs:string) as xs:string
{ ... }
此帖子标记为MarkLogic,因为我将从MarkLogic执行此操作。
感谢。
答案 0 :(得分:0)
这主要是基于意见的(如果mods关闭你的问题,不要感到惊讶),但听起来你有一组转换组件和一组描述特定转换管道配置的文档。对我来说,这似乎是一种合理的关注点分离。我不知道任何现有的库完全重复这个,但它确实类似于XProc。
我唯一的注意事项是,除非您特别需要将管道存储为文档,否则您可以简单地编写XQuery函数来代表管道,并避免构建组件以将XML转换为XQuery函数调用的开销。如果您需要使功能更具组合性,请查看higher-order (i.e.: first-class) functions。