Получение имени файла XML с помощью XQuery
я храню свои сущности в существующей базе данных 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 ответов
поскольку вы используете eXist-db, вы можете использовать util: document-name ():
util:document-name($dvd)
fn:base-uri
вернет весь URI, а не последнюю часть URI, но вы можете использовать решение regex в сочетании с fn:base-uri
функция для решения, которое не зависит от существующих функций.
Это конкретное регулярное выражение обрезает расширение с \.\w+$ и захватывает имя файла без расширения в capture group 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+$','')
return db:replace('13F', $file, $doc)
альтернативно для всего имени файла с расширением
let $file := replace(fn:base-uri($doc),'^(.*/)(.*?\.\w+$)','')