9

我将实体存储在 eXist XML 数据库中,并使用文件名(资源 ID)作为实体的 ID。

例子:

String xquery = "for $movie in collection('/db/movie')//movie "
    + "return $movie";

执行此查询后,我检索org.xmldb.api.base.Resource用于创建实体的内容的实例。当我想设置这个实体的 id 时,我这样做:

dvd.setId(rs.getId());

问题是,如果我执行这样的查询:

String xquery = "for $dvd in collection('/db/dvd')//dvd "
        + "return <dvd>"
        + "{$dvd/title}"
        + "{$dvd/type}"
        + "{"
        + "<content>"
        + " {"
        + " for $movie in $dvd/content//movie"
            + "     let $movieIn := doc(concat(\"/db/movie/\", $movie/@id))/movie"
        + "     return "
            + "                    <movie id=\"{$movie/@id}\">"
            + "                          {$movieIn/name}"
            + "                          {$movieIn/director}"
            + "                          {$movieIn/year}"
            + "                          {$movieIn/country}"
            + "                          {$movieIn/actors}"
            + "                          {$movieIn/genres}"
            + "                    </movie>"
        + " }"
        + "</content>"
        + "}"
        + "</dvd>";

rs.getId()返回null。我也尝试getDocumentId()这个类的方法,但它也返回null了。有没有办法让它返回资源的 id(这是实体存储的文件的名称)?

如果不可能,有没有办法(函数或其他东西)使用 XQuery 查询获取我正在使用的文件的文件名(我的意思是,数据库从中检索数据)?

我尝试替换这一行:

+ "return <dvd>"

有了这个:

+ "return <dvd id=\"{$dvd}\">"

(这样我就可以从属性中获取文件名)但它不返回文件名。

4

3 回答 3

11

由于您使用的是 eXist-db,因此您可以使用util:document-name()函数:

util:document-name($dvd)
于 2013-03-11T17:22:41.633 回答
10

您可能正在寻找fn:base-uri(). 见这里

于 2011-06-17T13:25:24.040 回答
0

fn:base-uri将返回整个 URI 而不是 URI 的最后一部分,但您可以将正则表达式解决方案与函数结合使用,fn:base-uri以获得不依赖于 eXist 特定函数的解决方案。

这个特殊的正则表达式用\.\w+$修剪扩展名,并在捕获组 2 中捕获不带扩展名的文件名

declare namespace db="http://basex.org/modules/db";
declare namespace file="http://expath.org/ns/file";
declare variable $path as xs:string external;

let $docs := collection($path)
for $doc in $docs
return
let $file := replace(fn:base-uri($doc),'^(.*/)(.*?)\.\w+$','$2')
return db:replace('13F', $file, $doc)

或者对于带有扩展名的整个文件名

  let $file := replace(fn:base-uri($doc),'^(.*/)(.*?\.\w+$)','$2')
于 2016-06-30T21:03:15.907 回答