Получение имени файла XML с помощью XQuery - PullRequest
7 голосов
/ 17 июня 2011

Я сохраняю свои сущности в базе данных eXist XML и использую имя файла (идентификатор ресурса) в качестве идентификатора сущности.

Пример:

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

После выполнения этого запросаЯ извлекаю экземпляр org.xmldb.api.base.Resource, содержимое которого я использую для создания объекта.Когда я хочу установить идентификатор этой сущности, я делаю это следующим образом:

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.Есть ли способ заставить его возвращать идентификатор ресурса (который является именем файла, в котором хранится сущность)?

Если это невозможно, есть ли способ (функция или что-то)получить имя файла, с которым я работаю (я имею в виду, база данных получает данные) с помощью запроса XQuery?

Я пытался заменить эту строку:

+ "return <dvd>"

наэто:

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

(чтобы я мог получить имя файла из атрибута), но он не возвращает имя файла.

Ответы [ 3 ]

8 голосов
/ 11 марта 2013

Поскольку вы используете eXist-db, вы можете использовать функцию util: document-name () :

util:document-name($dvd)
7 голосов
/ 17 июня 2011

Возможно, вы ищете fn:base-uri().Смотри здесь .

0 голосов
/ 01 июля 2016

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')
...