2017-06-21 72 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