2015-06-17 3 views
0

Как создать массив и перебрать его и получить его значения?XSLT - массивы и итерации

Пример:

<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> 

<xsl:for-each select="$element"> 
    <p><xsl:value-of select="."/></p> 
</xsl:for-each> 

Фактический выход:

<p>0100</p> 

Должно быть:

<p>0</p> 
<p>1</p> 
<p>0</p> 
<p>0</p> 

EDIT: массив должен быть динамически!

+0

Вы используете XSLT 1.0 или XSLT 2.0? –

+0

Я просто буду использовать версию, в которой это будет работать :) – Pali

+0

xsl: value-of возвращает текстовое значение текущего узла - амальгаму текста дочерних узлов. Используйте $ element/item или xsl: copy-of или xsl: apply-templates, чтобы соответствовать самому низкому уровню и генерировать теги p. – Mike

ответ

0

Учитывая

<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 нет массивов.

0

@Pali,

Пожалуйста, поделитесь XML, который должен быть преобразован. IT поможет.

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:template match="/"> 
<xsl:for-each select="document/items/item"> 
<item> 
<xsl:choose> 
<p> 
<xsl:when test="/@attr">1</xsl:when> 
<xsl:otherwise>0</xsl:otherwise> 
</p> 
</xsl:choose> 
    </item> 
    </xsl:for-each> 
</xsl:variable> 
</xsl:template> 
</xsl:stylesheet> 
Смежные вопросы