Учитывая
<xsl:variable name="element">
<xsl:for-each select="document/items/item">
<item>
<xsl:choose>
<xsl:when test="/@attr">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</item>
</xsl:for-each>
</xsl:variable>
и XSLT 1.0 процессор переменная представляет фрагмент результирующего дерева типа, где все, что вы можете сделать, это использовать <xsl:copy-of select="$element"/>
или <xsl:value-of select="$element"/>
или где вам нужно использовать функцию расширения как exsl:node-set
для преобразования результат фрагмент дерева в узел набора так
<xsl:for-each select="exsl:node-set($element)/item">
<p><xsl:value-of select="."/></p>
</xsl:for-each>
должен делать (с xmlns:exsl="http://exslt.org/common"
объявленным в таблице стилей).
С XSLT 2.0 или 3.0 ваша переменная является временным деревом с корневым узлом, содержащим элемент item
, поэтому вам не нужна функция расширения, но вам нужно обратиться к элементам item
, например.
<xsl:for-each select="$element/item">
<p><xsl:value-of select="."/></p>
</xsl:for-each>
В качестве альтернативы в XSLT 2.0/3.0 вы можете изменить переменную декларацию
<xsl:variable name="element" as="element(item)*">
<xsl:for-each select="document/items/item">
<item>
<xsl:choose>
<xsl:when test="/@attr">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</item>
</xsl:for-each>
</xsl:variable>
иметь переменную с последовательностью item
элементов, в этом случае ваш
<xsl:for-each select="$element">
<p><xsl:value-of select="."/></p>
</xsl:for-each>
будет делать то, что вы хотите.
В XSLT 1.0 или 2.0 нет массивов.
Вы используете XSLT 1.0 или XSLT 2.0? –
Я просто буду использовать версию, в которой это будет работать :) – Pali
xsl: value-of возвращает текстовое значение текущего узла - амальгаму текста дочерних узлов. Используйте $ element/item или xsl: copy-of или xsl: apply-templates, чтобы соответствовать самому низкому уровню и генерировать теги p. – Mike