Подтвердить что ты не робот

Создание массивов в xslt

Может ли массив быть создан и использован в xslt? Если есть подходящие примеры онлайн для изучения? Если нет способа хранения значений таким образом, который имитирует массив?

4b9b3361

Ответ 1

С XSLT 2.0 вы можете моделировать любой тип данных, который вы хотите.

В качестве примера:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:variable name="array" as="element()*">
        <Item>A</Item>
        <Item>B</Item>
        <Item>C</Item>
    </xsl:variable>
    <xsl:template match="/">
        <xsl:value-of select="$array[2]"/>
    </xsl:template>
</xsl:stylesheet>

При любом вводе вывод:

B

В XSLT 1.0 отсутствует тип данных дерева данных Temporaly. Существует тип данных фрагмента дерева результатов, который не позволяет использовать оператор node -set. Таким образом, единственный способ - это расширение функций: в этом случае node-set() из EXSLT (MSXSL также имеет встроенное расширение node-set()).

Итак, в XSLT 1.0 без расширений вы можете иметь только встроенную модель данных или по параметрам или по внешнему документу. В качестве примера:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:variable name="inline-array">
        <Item>A</Item>
        <Item>B</Item>
        <Item>C</Item>
    </xsl:variable>
    <xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/>
    <xsl:template match="/">
        <xsl:value-of select="$array[2]"/>
    </xsl:template>
</xsl:stylesheet>

Результат с любым вводом:

B

Только если вы хотите, я могу предоставить вам пример XSLT 1.0 плюс расширения (это не стандартный...)

Ответ 2

Последовательность XPath 2.0 (доступная в XSLT 2+) является самой близкой к массиву:

(1 to 10)[3]

принимает значение 3

('a', 'b', 'a', 'c')[3]

принимает значение 'a'

Элементы последовательности могут быть любого мыслимого типа, допустимого в XPath, за исключением самой последовательности - вложенные последовательности не разрешены.

Обратите внимание. Последовательности не совпадают с массивами:

  • Последовательности неизменяемы. Любая операция обновления последовательности (добавление или добавление элемента, вставка элемента или удаление элемента) создает новую последовательность.

  • Время доступа к n-му элементу не гарантируется O (1), поскольку это для массивов и может быть O (n).

Ответ 3

Нет, не как таковой. Ближайшей концепцией является node -множества, которые являются наборами узлов. Всякий раз, когда результатом выбора является количество узлов, вы получаете node -set. К ним можно получить нотацию индекса (начиная с 1), поэтому к первому элементу node -set можно получить доступ с обозначением, например selectedNodes[1].