can array's be created and used in xslt? If so are there suitable examples online to study? If not is there a way to store values in a way that mimics an array?
No, not as such. The closest concept is node-sets, which are collections of nodes. Whenever the result of a select is a number of nodes, you get a node-set. These can be accessed with a index notation (starting with 1), so the first element of the node-set can be accessed with notation such as selectedNodes[1]
.
With XSLT 2.0 you can model any data type you want to.
As example:
<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>
With any input, output:
B
In XSLT 1.0 there is not Temporaly Result Tree data type. There is a Result Tree Fragment data type that does not allow node-set operator. So, the only way to go is with extensions functions: in this case node-set()
from EXSLT (MSXSL has a built-in node-set()
extension, also).
So, in XSLT 1.0 without extensions you can have only inline data model, or by params or by external document. As example:
<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>
Result, with any input:
B
Only if you want to, I can provide you a XSLT 1.0 plus extensions example (It's not standar...)
The XPath 2.0 sequence (available in XSLT 2+) is the closest thing to an array:
(1 to 10)[3]
evaluates to 3
('a', 'b', 'a', 'c')[3]
evaluates to 'a'
The items of a sequence can be of any conceivable type allowed in XPath, with the exception of sequence itself -- nested sequences are not allowed.
Do note: Sequences are not the same as arrays:
Sequences are immutable. Any updating operation on a sequence (appending or prepending an item, inserting an item or removing an item) produces a new sequence.
The access time to the n-th item is not guaranteed to be O(1) as this is for arrays, and may be O(n).