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()ましたが、同様に返されます。リソースのID(エンティティが保存されているファイルの名前)を返す方法はありますか?null

それが不可能な場合、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-uriURI の最後の部分ではなく URI 全体を返しますが、正規表現ソリューションを関数と組み合わせて使用​​することで、fn:base-urieXist 固有の関数に依存しないソリューションを実現できます。

この特定の正規表現は、拡張子を\.\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 に答える