我想知道是否有方法在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',结果是书籍列表,每个人都有一个表格。是否可以在另一个模板函数中使用模板函数调用? –