Есть ли у XSLT понятие массива? - PullRequest
0 голосов
/ 14 декабря 2011

Я никогда раньше не использовал XSLT и ищу какой-то совет.

У меня есть следующие элементы, возвращенные в XML из коробки GSA:

<MT N="searchCategories" V="Category 1"/>
<MT N="searchCategories" V="Category 2"/>
etc etc

Может быть любое количествоэти категории.

Мне просто интересно, имеет ли XSLT какую-либо концепцию массива?

Если это так:

  • Как я могу перечислить все узлы выше в массив?
  • Как узнать длину массива?

Если нет:

  • Есть ли обходной путь?

Я полагаю, что использую XSLT версии 1.0

Ответы [ 2 ]

5 голосов
/ 14 декабря 2011

Как объяснил @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) при использовании массивоподобных обозначений с наборами узлов или последовательностями.

3 голосов
/ 14 декабря 2011

XSLT 2.0 поддерживает последовательности, которые во многом похожи на массивы. Последовательности могут содержать узлы или атомарные значения (примерами атомарных значений являются строки, числа, даты и т. Д.). Структуры данных в XSLT 1.0 гораздо более ограничены; вы в основном ограничены моделированием вещей в виде деревьев XML.

Однако вы задаете не тот вопрос. Учитывая ваш ограниченный опыт работы с языком, было бы лучше описать вывод, который ваша программа должна производить для данного ввода, и попросить совета о том, как выполнить преобразование.

...