Модификация обновленного DOM в XQuery через XQIB - PullRequest
1 голос
/ 30 марта 2011

Новичок в XQuery. Я использую XQIB («XQuery In Browser», т. Е. Zorba реализован на JavaScript) для обработки его на стороне клиента.

В следующем тестовом документе, если я нажму первую кнопку «Добавить абзацы», а затем вторую кнопку «Сделать несколько абзацев жирным шрифтом», она будет работать, как и ожидалось. Однако, если я нажимаю «Добавить абзацы» дважды (независимо от того, нажимаю я вторую промежуточную кнопку или нет), вторая кнопка перестает работать.

Это вероятно ошибка в XQIB или XQuery ведет себя иначе, чем я ожидал?

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>XQIB Test</title>
<meta charset="UTF-8"/>
<script type="text/javascript" src="mxqueryjs/mxqueryjs.nocache.js"></script>
<script type="application/xquery">
declare default element namespace "http://www.w3.org/1999/xhtml";
declare namespace hresume="http://microformats.org/profile/hresume";
declare namespace hcard="http://microformats.org/profile/hcard";

declare updating function local:addparas($loc, $evtObj) {
    insert node <p>test1</p>
        as last into b:dom()//body,
    insert node <p>test2</p>
        as last into b:dom()//body
};

b:addEventListener(b:dom()//input[@value='Add paragraphs'], "onclick", xs:QName("local:addparas"))
</script>
<script type="application/xquery">
declare updating function local:boldparas($loc, $evtObj) {
    replace node b:dom()//p[.='test1'] with <p><b>test1</b></p>
};

b:addEventListener(b:dom()//input[@value='Make some parapgraphs bold'], "onclick", xs:QName("local:boldparas"))
</script>
</head>
<body>
<h1>Insert example</h1>
<input type="button" value="Add paragraphs" />
<input type="button" value="Make some parapgraphs bold" />
<p>Hey</p>
</body>
</html>

1 Ответ

0 голосов
/ 31 марта 2011

Что должен сделать XQIB, это вызвать ошибку во время выполнения.В описываемой вами ситуации целевое выражение replace в local: boldparas возвращает последовательность из нескольких узлов, где, согласно спецификации, это должен быть единственный узел:

Если результатнепустой и не состоит из одного элемента, атрибута, текста, комментария или узла инструкции обработки, [err: XUTY0008] повышается.

(взято из http://www.w3.org/TR/xquery-update-10/#id-replace)

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

for $node in b:dom()//p[.='test1']
return replace node $node with <p><b>test1</b></p>
...