2012-04-17 1 views
1

Я работаю с этой очень простой XML-документ (который я позаимствовал из учебника), книги-mod.xml:XQuery: почему это преобразование изменяет исходный документ?

<?xml version="1.0" encoding="ISO-8859-1"?> 

<bookstore> 

<book category="COOKING"> 
    <title lang="en">Everyday Italian</title> 
    <author>Giada De Laurentiis</author> 
    <year>2005</year> 
    <price>30.00</price> 
</book> 

<book category="CHILDREN"> 
    <title lang="en">Harry Potter</title> 
    <author>J K. Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
</book> 

<book category="WEB"> 
    <title lang="en">XQuery Kick Start</title> 
    <author>James McGovern</author> 
    <author>Per Bothner</author> 
    <author>Kurt Cagle</author> 
    <author>James Linn</author> 
    <author>Vaidyanathan Nagarajan</author> 
    <year>2003</year> 
    <price>49.99</price> 
</book> 

<book category="WEB"> 
    <title lang="en">Learning XML</title> 
    <author>Erik T. Ray</author> 
    <year>2003</year> 
    <price>39.95</price> 
</book> 

</bookstore> 

И используя этот запрос:

copy $d := doc("books-mod.xml") 
modify (
    for $t in $d//title 
    return replace value of node $t with concat($t, " in bed") 
) 
return $d 

Запустится запроса и делает то, что я ожидаю (т.е. добавляет текст «в постель» к каждому названию книги). Однако удивительно, что он также изменяет исходный документ ... Я думал, что весь смысл copy с этим преобразованием состоял в том, что мы модифицировали копию документа.

Что мне здесь не хватает?

Я использую xqilla с -u для выполнения запроса.

ответ

2

Вы правы, это определенно ошибка. Выражение Transform явно not an updating expression: преобразование

Выражение это простое выражение, потому что он не изменяет значения всех существующих узлов.

Какая версия XQilla вы используете? change log for version 2.2.2 упоминает что-то связанное:

  • Fixed выражение преобразования для копирования узлов документа, а не растворяя их.

Так что, возможно, это уже исправлено.

+0

Хм. Я использую 2.3.0, поэтому он должен быть там ... +1 для подтверждения этого поведения неверно. Мне придется копаться и посмотреть, не видно ли это тому, что я вижу. – FatalError

+2

Фактически, эффект запроса на постоянное filestore полностью определяется реализацией; обработчик запросов, отформатировавший ваш диск при написании 2 + 2, может быть непопулярным, но он не будет несоответствующим. –

+0

Я не осознавал этого, бот теперь, когда я думаю об этом, это имеет смысл. Чем больше ты знаешь... –