Как объяснил @Michael Kay, структура данных массива не поддерживается моделью данных XPath (XDM) как для XPath 1.0, так и для XPath 2.0.
Однако можно использовать синтаксис, похожий на массив, например:
В XPath 1.0 / 2.0 можно определить переменную, которая будет содержать определенный набор узлов , и к ним можно обращаться по их позиции (в порядке документа), указав эту позицию в предикате.
Вот пример :
<xsl:variable name="vTransfers" select="/*/transfer"/>
определяет переменную с именем vTransfers
со значением набора узлов всех элементов transfer
, каждый из которых является дочерним элементом верхнего элемента XML-документа.
Тогда
$vTransfers[1]
выбирает первый элемент, содержащийся в $vTransfers
.
$vTransfers[2]
выбирает второй элемент, содержащийся в $vTransfers
, ...
$vTransfers[position() = $k]
выбирает узел из $vTransfers
, позиция которого в порядке документа равна значению, содержащемуся в переменной $k
.
Кроме того, XPath 2.0 поддерживает концепцию последовательностей . Последовательность похожа на список элементов. Элемент может быть любого типа - не только узел. Элементы в последовательности упорядочены так, как они отображаются (определены) в последовательности. Если два элемента в последовательности являются узлами, их порядок по-прежнему определен в последовательности, и это может отличаться от их порядка документов.
Пример
<xsl:variable name="vNumList" as="xs:integer*" select="3, 5, 7"/>
тогда при ссылке так:
$vNumlist[2]
производит:
5
Помните : Хотя эти синтаксические конструкции напоминают выбор элемента из массива, наборы узлов и последовательности являются , а не массивами. В частности, им обычно не хватает очень быстрого доступа O (1), который массив имеет к своим элементам. В случае наборов узлов и последовательностей эффективность доступа к элементу в случайной позиции обычно составляет O (N). Это означает, что алгоритм, который является O (N) при использовании массива, может быть O (N ^ 2) при использовании массивоподобных обозначений с наборами узлов или последовательностями.