2016-01-19 15 views
2

Я хотел бы, чтобы следующий запрос, чтобы записать результаты в файл xml. В настоящее время он записывает только первый элемент результата в xml-файл, независимо от количества элементов.Файл XQuery: записывает только одну строку

Почему это происходит и как я могу это исправить?

let $fName := "C:\Users\user\Documents\Sitemaps\Updated Pages\Books.xml" 

for $x in doc("http://www.w3schools.com/xsl/books.xml")/bookstore/book 
where $x/price>0 
return file:write($fName,$x/title) 
+1

FYI, StackSnippets предназначены только для кода, который может быть выполнен в браузере (как правило, JavaScript/CSS/etc). Для XQuery вы должны использовать кнопку '{}' в редакторе StackOverflow для регулярного формирования кода. –

ответ

1

file:write() не является особенностью стандартного языка, и он полагается на побочные эффекты, поэтому эффект зависит от того, какой процессор XQuery вы используете. Вы даже не указали объявление пространства имен, поэтому мы не можем определить, должен ли это быть вызов функции EXPath file:write().

Предполагая, что это вызов функции EXPath file:write(), тогда эффект file:write() должен состоять в том, чтобы записать все содержимое файла, а не добавлять его в файл. Если вы хотите добавить к файлу, используйте file:append(). В этой ситуации однако, мой инстинкт должен был бы написать все элементы в файл в одной операции, то есть:

let $doc := doc("http://www.w3schools.com/xsl/books.xml") 
return file:write($fName, $doc/bookstore/book[price>0]/title) 
1

на основе кода я ожидал бы писать только последний титул в документе. Вы не говорите, какой процессор XQuery вы используете, но, возможно, это поведение, определяемое реализацией, возможно, эквивалентно ошибке «конфликтующих обновлений».

Оберните весь запрос в элементе XML (это недопустимый для создания XML с несколькими корневыми узлами), и написать, что весь документ на диск (вызов file:write только один раз):

file:write($fName, 
    element titles { 
    for $x in doc("http://www.w3schools.com/xsl/books.xml")/bookstore/book 
    where $x/price>0 
    return $x/title 
    }) 
1

Для Basex, вызывая file:write() перезапишет любой существующий файл. Вы вызываете его для каждого элемента, поэтому последний будет «выигрывать».

http://docs.basex.org/wiki/File_Module#file:write

Пишет сериализованную последовательность элементов в указанном файле. Если файл уже существует, он будет перезаписан.

Вы должны либо изменить XQuery, чтобы написать последовательность элементов, как @wst предполагает, или убедиться, что каждый элемент записывается уникальный файл URI