Как «at» используется в XQuery для определения позиции узла?

Где и как $ р определяется или созданный из ? Почему это вообще индекс или позиция узла?


Информация из w3schools, пример книжного магазина.

выход:

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

запрос:

xquery version "3.1";

let $doc := db:open("bookstore")
let $books := $doc/bookstore/book

for $book at $p in $books 
where $p eq 2

return $book

Это «at» присваивает индекс $ p? тем не менее, насколько я понимаю, xpath является декларативным, а не итеративным. Тем не менее, это как минимум напоминает итерацию. Возможно, «at» - это не итерация, а просто позиция этого узла в этом документе?

смотрите также:

C # Какой язык запросов указать в правиле для извлечения двух узлов книги

для связанного вопроса.

# xpath xquery basex flwor
Источник
Codelisting
за 2 против

Это может напоминать итерацию, но чисто функционально. Это операция сопоставления, при которой (концептуально) вызывается функция для обработки каждого элемента входной последовательности; функция вызывается с двумя параметрами: $ x - это обрабатываемый элемент, а $ p - его позиция в последовательности. Порядок обработки не определен - все элементы могут обрабатываться параллельно или в обратном порядке, насколько вам известно.

за 1 против

См. W3.org XQuery 3.1, ссылка 3.12.2.For Clause

В явной итерации с использованиемfor ··· in построить:

for $v [at $p] in e1
return e2

по позиционным переменным :

Definition: A positional variable is a variable that is preceded by the keyword at.] A positional variable may be associated with a variable that is bound in a for clause. In this case, as the main variable iterates over the items in its binding sequence, the positional variable iterates over the integers that represent the ordinal numbers of these items in the binding sequence, starting with one. Each tuple in the output tuple stream contains bindings for both the main variable and the positional variable. If the binding sequence is empty and allowing empty is specified, the positional variable in the output tuple is bound to the integer zero. Positional variables always have the implied type xs:integer. The expanded QName of a positional variable must be distinct from the expanded QName of the main variable with which it is associated [err:XQST0089].

The following examples illustrate how a positional variable would have affected the results of the previous examples that generated tuples:

Initial clause:

for $x at $i in (100, 200, 300)

Output tuple stream:

($x = 100, $i = 1)
($x = 200, $i = 2)
($x = 300, $i = 3)

Так да,at $p в явной итерации создает переменную, и она может быть$i или что-то еще. (Индекс равен 1, как обычно в XPath).

за 1 против

Модель данных XQuery (и XPATH 2.0+, и XSLT 2.0+) основана на ЗАКАЗАННЫХ последовательностях.

$ P - это позиция $ x в последовательности

Посмотрите это ниже, чтобы увидеть и почувствовать это.

<root>
{
  for $x at $p in (10 to 20)
  where $x mod 2
  return <r pos='{$p}' value='{$x}' />
}
</root>

Выход

<root>
  <r pos="2" value="11"/>
  <r pos="4" value="13"/>
  <r pos="6" value="15"/>
  <r pos="8" value="17"/>
  <r pos="10" value="19"/>
</root>
Codelisting
Популярные категории
На заметку программисту