С 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 нет типа данных Временное дерево результатов. Существует тип данных Result Tree Fragment, который не допускает оператор набора узлов. Таким образом, единственный способ - использовать функции расширений: в данном случае 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 plus (Это не стандарт ...)