2010-07-29 1 views
3

Если я добавлю два документа в базу BaseX, допустим, normal.xml и normal2.xml, есть ли способ обратиться к каждому из них отдельно?Обратитесь к конкретному документу в базе данных BaseX с помощью XQuery

Я знаю о функции doc(), но она смотрит на файловую систему для их местоположения, а не в самой базе данных.

Например, если я запрашиваю у этого вопроса: doc("normal.xml")/name, тогда я получаю сообщение об ошибке normal.xml не найден.

Я также пробовал: basex:db("my-db-name")/doc("normal.xml")/name и получил ту же ошибку.

Любые идеи?

ответ

7

Я кончался с просьбой о BaseX mailing list и ответ я получил следующее:

for $doc in collection('test-db') 
    where matches(document-uri($doc), 'example.xml') 
return $doc 

Я также поинтересовался, почему не было прямой способ ссылки на документ, который хотел бы извлечь данные из постоянного времени, и ответ был:

Это связано с XQuery data model. XQuery не имеет формального представления о файлах внутри базы данных/коллекции (христианин может исправить меня, если я ошибаюсь), , поэтому команда collection() возвращает любую последовательность (document-) узлов для данной базы данных. Пользователь может выбрать те узлы, которые он хочет обработать.

В настоящее время мы ищем идеи по навигации в сборниках; что-то похожее на "collection ('db/path-to/document.xml'), который должен соответствовать текущей рекомендации W3C. Поскольку последующий документ-uri() обычно работает достаточно хорошо, это не слишком высоко в нашем списке приоритетов.

Спасибо за помощь.

4

Следующий запрос может помочь вам:

for $doc in collection('your-db-name') 
let $path := base-uri($doc) 
where ends-with($path, 'normal.xml') 
return $doc/name 
3

Функция doc() - это все, что вам нужно, если вы знаете. Предполагая, что вы создали и открыли базу данных с именем «MYDB,» если добавить документ с помощью следующей команды:

ADD TO your_name /some/path/on/filesystem.xml 

Вы всегда можете открыть следующий документ, используя:

XQUERY doc('mydb/your_name') 

ДОБАВИТЬ проигнорирует имя файла, которое вы ему дали, и использовать имя, указанное в URI. Будьте осторожны, хотя: при выполнении этой команды нет гарантии уникальности «your_name». И если это не уникально, функция (doc) будет генерировать ошибку BaseX (не входит в стандарт XQuery), говоря, что она соответствует нескольким документам.