2017-06-21 42 views
0

我有一组XQuery函数,它们表示可以执行以变换数据值的各种操作。每个函数都会取一个值,并加上一些变换所需的参数。计划是执行一系列嵌套函数调用来计算最终值。这个想法是这些管道将被配置,然后在执行之前持久化,因为相同的管道功能将以不同的起始值重复调用。因此,本以为是代表的调用堆栈一系列嵌套的XML元素,即将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 
{ ... } 
  1. 是这样的不好的主意,我应该采取不同的做法
  2. 是否有一个现有的库,可能已经提供此功能?

这篇文章被标记为MarkLogic,因为我将从MarkLogic执行此操作。

谢谢。

+0

我想知道为什么你限制自己的mylib函数。标记化,选择和转义应该充分利用现有功能进行覆盖。如果最终用户需要指导,那么您可以依靠这些文档。 – grtjn

+0

您是否考虑过[CPF](http://docs.marklogic.com/guide/cpf/overview)? –

+0

@grtjn这些只是例子。将会有更多的功能,但重点是通过某种图形界面让用户可配置的处理流水线。 –

回答

0

这主要是基于意见的(所以不要惊讶,如果mods关闭你的问题),但它听起来像你有一套转换组件和描述特定转换管道配置的一组文件。对我而言,这似乎是一个合理的关注点分离。我并不知道任何现有的库都完全相同,但它确实类似于XProc

我唯一需要注意的是,除非您特别需要将流水线存储为文档,否则可以简单地编写XQuery函数来代表流水线,并避免构建将XML转换为XQuery函数调用的组件的开销。如果你需要的功能更加可组合,请看higher-order (i.e.: first-class) functions

+0

我唯一的想法是,将XML格式的管道配置映射到允许用户配置peipleine的接口可能更容易,而不是解析调用其他转换函数的XQuery函数。 –

+0

@TJTang用户可配置的管道是使用文档的一个参数。但是如果用户是程序员,我会觉得很难说明问题。 – wst