我想知道是否有方法在eXist-db中共享html代碼片段。我有兩個不同的(更期待的)函數返回不同的結果相同的大html表單。當我在其中一箇中更改某些內容時,維護相同的代碼是令人討厭的。我曾嘗試:如何在eXist-db中的函數中共享標記片段?
- 保存它像HTML文件以及
doc()
功能加載(eXist中抱怨它不是一個XML文件,它是二進制 - 保存它像全局變量到一個單獨的模塊(eXist中抱怨。上下文有問題)我不知道如何傳遞這樣一個沒有名稱空間前綴的變量
- 將它保存爲一個返回自己的巨大變量的函數(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()*
,但沒有任何幫助。
非常感謝。一般來說,我的意思是'
如果eXist沒有投訴,那麼它是有效的XML。但是,如果存儲在.xml或.html文件中,不要指望「變量」(我認爲你必須指XQuery)「工作」;這樣的文件被視爲靜態文檔,不像.xq文件那樣進行評估。如果你需要你的表格是動態的,你肯定需要使用方法#2或#3。或者,第四個選項:使用eXist的模板工具:http://exist-db.org/exist/apps/doc/templating.xml。這可能非常適合你的任務。 – joewiz
嗯,我使用模板,但不知道是否可以嵌套函數。在模板中,我稱之爲'app:list-books',結果是書籍列表,每個人都有一個表格。是否可以在另一個模板函數中使用模板函數調用? –