使用XQuery获取XML文件的文件名

Vac*_*dik 8 java xquery exist-db

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

例:

String xquery = "for $movie in collection('/db/movie')//movie "
    + "return $movie";
Run Code Online (Sandbox Code Playgroud)

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

dvd.setId(rs.getId());
Run Code Online (Sandbox Code Playgroud)

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

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>";
Run Code Online (Sandbox Code Playgroud)

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

如果不可能,是否有一种方法(功能或某事)获取我正在使用的文件的文件名(我的意思是,数据库从中检索数据)与XQuery查询?

我试过更换这一行:

+ "return <dvd>"
Run Code Online (Sandbox Code Playgroud)

有了这个:

+ "return <dvd id=\"{$dvd}\">"
Run Code Online (Sandbox Code Playgroud)

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

mor*_*rja 9

你可能正在寻找fn:base-uri().看到这里.


joe*_*wiz 9

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

util:document-name($dvd)
Run Code Online (Sandbox Code Playgroud)