XSLT - работа с переменными типа массив и древо
В XSL возможность работы с переменными типа массив и дерево обеспечивается при помощи расширения exsl.
Переменную можно задать в явном виде
<xsl:variable name="process_stages">
<stage name="unprocessed"/>
<stage name="inprocess"/>
<stage name="processed"/>
</xsl:variable>
Либо, что правильнее, взять из дополнительного файла
<xsl:variable name="process_stages" select="document(\'lib_enums.xml\')/enums/process_stages"/>
После этого взять массив можно при помощи выражения exsl:node-set
<xsl:for-each select="exsl:node-set($process_stages)/stage">
<xsl:value-of select="@name"/>
</xsl:for-each>
Чтобы exsl работал необхдимо объявить пространство имен в шаблоне
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0">
Замечу что внутри for-each будет работать модель переменной, т.е. / = корень выбранного массива. Поэтому выбирать дополнительную информацию необходимо до цикла, а передавать прийдется через переменные
<xsl:variable name="base_url" select="/page/@base"/>
<xsl:for-each select="exsl:node-set($process_stages)/stage">
<a href="{$base_url}?stage={@name}"><xsl:value-of select="@name"/></a>
</xsl:for-each>