2016-01-26 61 views
0

我想知道是否有方法在eXist-db中共享html代碼片段。我有兩個不同的(更期待的)函數返回不同的結果相同的大html表單。當我在其中一箇中更改某些內容時,維護相同的代碼是令人討厭的。我曾嘗試:如何在eXist-db中的函數中共享標記片段?

  1. 保存它像HTML文件以及doc()功能加載(eXist中抱怨它不是一個XML文件,它是二進制
  2. 保存它像全局變量到一個單獨的模塊(eXist中抱怨。上下文有問題)我不知道如何傳遞這樣一個沒有名稱空間前綴的變量
  3. 將它保存爲一個返回自己的巨大變量的函數(eXist抱怨上下文有問題)

最佳做法是什麼?

UPDATE

好吧,我試圖把片段作爲一個模塊加載可變insinde功能。對我而言,這似乎是合理的。但是,我得到一個錯誤,當試圖返回的是:我打電話像這樣

err:XPDY0002 Undefined context sequence for 'child::snip:snippet' [at line 62, column 13, source: /db/apps/karolinum-apps/modules/app.xql] 
In function:a pp:book-search(node(), map, xs:string?) [34:9:/db/apps/karolinum-apps/modules/app.xql] 

declare function app:list-books($node as node(), $model as map(*)) { 
    for $resource in collection('/db/apps/karolinum-apps/data/mono') 
    let $author := $resource//tei:titleStmt/tei:author/text() 
    let $bookName := $resource//tei:titleStmt/tei:title/text() 
    let $bookUri := base-uri($resource) 
    let $imgPath := replace($bookUri, '[^/]*?$', '') 
    let $fileUri := ('/exist/rest' || $bookUri) 
    let $fileName := replace($bookUri, '.*?/', '') 
    return 
     if ($resource//tei:titleStmt/tei:title) 
     then 
      snip:snippet 
     else() 
}; 

任何想法,請?

UPDATE II

這裏我模塊中的功能:

module namespace snip = "http://46.28.111.241:8081/exist/db/apps/karolinum-apps/modules/snip"; 

declare function snip:snippet($node as node(), $model as map(*), $author as xs:string, $bookTitle as xs:string, $bookUri as xs:anyURI, $fileUri as xs:anyURI) as element()* { 
    let $snippet := 
     (
      <div class="panel panel-default"> 
       <div class="panel-heading"> 
        <h3 class="panel-title"><a href="{$fileUri}">{$bookTitle}</a> ({$author})</h3> 
       </div> 
       <div class="panel-body"> 
       ... 
       </div> 
     ) 
     return $snippet 
}; 

在這裏,我想叫它:

declare function app:list-books($node as node(), $model as map(*)) { 
    for $resource in collection('/db/apps/karolinum-apps/data/mono') 
    let $author := $resource//tei:titleStmt/tei:author/text() 
    let $bookTitle := $resource//tei:titleStmt/tei:title/text() 
    let $bookUri := base-uri($resource) 
    let $fileUri := ('/exist/rest' || $bookUri) 
    let $fileName := replace($bookUri, '.*?/', '') 
    where not(util:is-binary-doc($bookUri)) 
    order by $bookTitle, $author 
    return 
     snip:snippet($author, $bookTitle, $bookUri, $fileUri) 
}; 

它拋出:

err:XPST0017 error found while loading module app: Error while loading module app.xql: Function snip:snippet() is not defined in namespace 'http://46.28.111.241:8081/exist/db/apps/karolinum-apps/modules/snip' [at line 35, column 9] 

當我試圖將代碼片段放入一個變量中時,不可能將那些使用的局部變量傳遞給它(它會投擲$fileUri is not set)。此外,我試圖改變返回的類型element()*,但沒有任何幫助。

回答

1

我非常接近。有必要以某種方式將參數傳遞給嵌套函數,並省略eXist的典型參數$node as node(), $model as map(*)

模板功能:

declare function app:list-books($node as node(), $model as map(*)) { 
    for $resource in collection('/db/apps/karolinum-apps/data/mono') 
    let $author := $resource//tei:titleStmt/tei:author/text() 
    let $bookTitle := $resource//tei:titleStmt/tei:title/text() 
    let $bookUri := base-uri($resource) 
    let $bookId := xs:integer(util:random() * 10000) 
    let $fileUri := ('/exist/rest' || $bookUri) 
    let $fileName := replace($bookUri, '.*?/', '') 
    where not(util:is-binary-doc($bookUri)) 
    order by $bookTitle, $author 
    return 
     snip:snippet($author, $bookTitle, $bookUri, $bookId, $fileUri) 
}; 

摘錄功能:

declare function snip:snippet($author as xs:string, $bookTitle as xs:string, $bookUri as xs:anyURI, $bookId as xs:string, $fileUri as xs:anyURI) as element()* { 
    let $snippet := 
     (
      <div class="panel panel-default"> 
      ... 
      </div> 
     ) 
    return $snippet 
}; 
1

您的所有方法都應該有效。讓我來解決每一個:

  1. 是結構良好的HTML片段XML?如果是這樣,請將其保存爲例如form.xmlform.html(因爲默認情況下,eXist假定.html擴展名的文件格式正確;請參閱eXist安裝文件夾中的mime-types.xml),並參考doc($path)。如果格式不正確,則可以將其保存爲form.txt並將其與util:binary-to-string(util:binary-doc($path))一同拉入。或者讓HTML格式良好並使用第一種選擇。

  2. 這也是有效的,所以你不能正確地聲明或引用全局變量。你得到了什麼確切的錯誤?你能發佈一個我們可以運行的小例子片段來重現你的結果嗎?

  3. 參見#2。

+0

非常感謝。一般來說,我的意思是'

...
'在'div'中,有一個大的形式。我不確定它是否是嚴格有效的XML(eXist不會抱怨)。但它使用了幾個變量。該函數根本不會返回它(現在)。啊,是的,這些變量不是主動的(像文字一樣傳遞)。 –

+0

如果eXist沒有投訴,那麼它是有效的XML。但是,如果存儲在.xml或.html文件中,不要指望「變量」(我認爲你必須指XQuery)「工作」;這樣的文件被視爲靜態文檔,不像.xq文件那樣進行評估。如果你需要你的表格是動態的,你肯定需要使用方法#2或#3。或者,第四個選項:使用eXist的模板工具:http://exist-db.org/exist/apps/doc/templating.xml。這可能非常適合你的任務。 – joewiz

+0

嗯,我使用模板,但不知道是否可以嵌套函數。在模板中,我稱之爲'app:list-books',結果是書籍列表,每個人都有一個表格。是否可以在另一個模板函數中使用模板函數調用? –

相關問題