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