Определение того, соблюдается ли шаблон порядка в узлах с помощью XQuery

У меня есть код xml ниже с 4 узлами <e>, и мне нужно создать процедуру XQuery, в которую я передаю 2 параметра (даже 3) param1=EP, param2=PRF и определяю, какие узлы <e> представляют узлы в этом порядке EP перед PRF . После этого перепечатайте ту же структуру, но с узлом, который должен иметь новый атрибут с именем order со значением yes или no <e ordered="yes">

<?xml version="1.0" encoding="UTF-8"?>
<results>
<e>
<element sign="none;isroot:yes">
    <e_afl>kamatsa</e_afl><e_asl>crawl</e_asl>
</element>
<element sign="equal">
    <e_afl>vai</e_afl><e_asl>DUR</e_asl>
</element>
<element sign="hyphen">
    <e_afl>t</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ak</e_afl><e_asl>PRF</e_asl>
</element>
<element sign="hyphen">
    <e_afl>i</e_afl><e_asl>REAL</e_asl>
</element>
<element sign="equal">
    <e_afl>na</e_afl><e_asl>1SG.O</e_asl>
</element>
</e>
<e>
<element sign="none">
    <e_afl>i</e_afl><e_asl>3m.A</e_asl>
</element>
<element sign="equal;isroot:yes">
    <e_afl>pos</e_afl><e_asl>hit</e_asl>
</element>
<element sign="hyphen">
    <e_afl>a</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>vai</e_afl><e_asl>DUR</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ve</e_afl><e_asl>FRUS</e_asl>
</element>
<element sign="hyphen">
    <e_afl>t</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ak</e_afl><e_asl>PRF</e_asl>
</element>
<element sign="hyphen">
    <e_afl>a</e_afl><e_asl>REAL</e_asl>
</element>
<element sign="equal">
    <e_afl>na</e_afl><e_asl>1SG.O</e_asl>
</element>
</e>
<e>
<element sign="none">
    <e_afl>y</e_afl><e_asl>3m.A</e_asl>
</element>
<element sign="equal;isroot:yes">
    <e_afl>aNt</e_afl><e_asl>work</e_asl>
</element>
<element sign="hyphen">
    <e_afl>vai</e_afl><e_asl>DUR</e_asl>
</element>
<element sign="hyphen">
    <e_afl>t</e_afl><e_asl>PRF</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ak</e_afl><e_asl>CAUS.SOC</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ak</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>i</e_afl><e_asl>REAL</e_asl>
</element>
<element sign="equal">
    <e_afl>ri</e_afl><e_asl>3m.O</e_asl>
</element>
</e>
<e>
<element sign="none">
    <e_afl>n</e_afl><e_asl>1SG.S</e_asl>
</element>
<element sign="equal;isroot:yes">
    <e_afl>aNt</e_afl><e_asl>work</e_asl>
</element>
<element sign="hyphen">
    <e_afl>a</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>vai</e_afl><e_asl>DUR</e_asl>
</element>
<element sign="hyphen">
    <e_afl>t</e_afl><e_asl>EP</e_asl>
</element>
<element sign="hyphen">
    <e_afl>ak</e_afl><e_asl>PRF</e_asl>
</element>
<element sign="hyphen">
    <e_afl>i</e_afl><e_asl>REAL</e_asl>
</element>
</e>
</results>

person richardtk_1    schedule 20.05.2014    source источник
comment
что ты уже испробовал? Кроме того, какой процессор XQuery вы используете (особенно интересно, поддерживает ли процессор обновление XQuery. Без этого обновление элемента невозможно, вы должны создать его заново).   -  person dirkk    schedule 20.05.2014
comment
Я использую BaseX 7.8.2 для Windows, который поддерживает XQuery 3.0 basex.org/products/xquery.   -  person richardtk_1    schedule 20.05.2014
comment
Важной частью является не обновление XQuery, которое является другим стандартом, чем XQuery 3.0. Но BaseX поддерживает и это, так что у вас все хорошо :)   -  person dirkk    schedule 20.05.2014


Ответы (1)


BaseX поддерживает Обновление XQuery. У него также есть хороший (на данный момент все еще зависящий от реализации, но вопрос стандартизации в настоящее время находится на рассмотрении в W3C) оператор под названием update, упрощающий выражения преобразования.

Обратите внимание, что ваш XML в настоящее время имеет неправильный формат, поскольку XML-документы всегда имеют один корневой элемент. Если вы добавите это, следующее должно работать:

for $e in doc("your-xml-file.xml")//e
return
  if ($e/element[e_asl = "EP"][following-sibling::element/e_asl = "PRF"])
  then $e update insert node (attribute {"ordered"} {"yes"}) into .
  else $e

Кстати, если вы хотите изменить исходную базу данных, вы можете ввести следующую команду

SET WRITEBACK true

(или запустите BaseX с помощью командной строки и команды -u) и выполните следующее:

for $e in doc("e.xml")//e[element[e_asl = "EP"][following-sibling::element/e_asl = "PRF"]]
return insert node (attribute {"ordered"} {"yes"}) into $e
person dirkk    schedule 20.05.2014