XSLT 1.0: строка в переменной массива

У меня есть переменная, как показано ниже:

<xsl:variable name="ARRAY">
One,Two,Three,Four
</xsl:variable>

В XSLT 2.0 я использовал функции токенизации и установил переменную массива:

<xsl:variable name="tokenizedSample" select="tokenize($ARRAY,',')"/>

и получить значение массива с помощью:

<xsl:value-of select="$tokenizedSample[1]"/>

К сожалению, я должен использовать XSLT 1.0, и я не знаю, как исправить эту ситуацию... Я нашел несколько примеров для создания шаблона, как показано ниже:

 <xsl:template name="SimpleStringLoop">
    <xsl:param name="input"/>
    <xsl:if test="string-length($input) &gt; 0">
      <xsl:variable name="v" select="substring-before($input, ',')"/>
      <field>
        <xsl:value-of select="$v"/>
      </field>
      <xsl:call-template name="SimpleStringLoop">
        <xsl:with-param name="input" select="substring-after($input, ',')"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

и вызывая этот шаблон, как показано ниже:

        <xsl:variable name="fields">
              <xsl:call-template name="SimpleStringLoop">
                <xsl:with-param name="input" select="$ARRAY"/>
              </xsl:call-template>
        </xsl:variable>

и доступ к этому новому массиву с помощью:

<xsl:value-of select="$fields[1]"/>

но не работает.

Как я могу сделать?

Мне нужна переменная XSLT 1.0 в виде массива, потому что я хочу прочитать ее, например:

$newArray[1]

Спасибо.


person Diaboliko    schedule 13.11.2015    source источник
comment
Как вы обнаружили, XPath 1.0 (и, следовательно, XSLT 1.0) не поддерживает произвольные последовательности значений, а поддерживает только наборы узлов из исходного документа. Вместо того, чтобы спрашивать о деталях того, как вы могли бы заставить этот конкретный подход работать в версии 1.0, было бы более продуктивно объяснить задачу более высокого уровня, которую вы пытаетесь выполнить, с некоторыми примерами входных данных и желаемого результата — вполне вероятно, что это совершенно другой подход. будет более уместно.   -  person Ian Roberts    schedule 13.11.2015


Ответы (1)


Я не понимаю, почему вы должны определить переменную, которая нуждается в токенизации, вместо того, чтобы определить ее как «токенизированную» для начала.

В XSLT 1.0 это можно сделать так:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://www.example.com/my"
exclude-result-prefixes="my">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<my:items>
    <item>One</item>
    <item>Two</item>
    <item>Three</item>
    <item>Four</item>
</my:items>

<!-- the rest of the stylesheet -->

</xsl:stylesheet>

С этим на месте вы можете сделать:

<xsl:value-of select="document('')/xsl:stylesheet/my:items/item[2]"/>

из любого места в вашей таблице стилей, чтобы получить "Two".


Конечно, вы можете поместить «массив» в переменную:

<xsl:variable name="my-items" select="document('')/xsl:stylesheet/my:items/item" />

так что вы можете сократить ссылку до:

<xsl:value-of select="$my-items[2]"/>
person michael.hor257k    schedule 13.11.2015
comment
Моя переменная ARRAY является переменной param, и я должен читать ее как массив. Эта переменная param установлена ​​​​с One, Two, Three, Four, но я могу установить ее по своему усмотрению. Что ты посоветуешь? - person Diaboliko; 16.11.2015
comment
Я пытаюсь установить переменную так: но ничего... - person Diaboliko; 16.11.2015
comment
@Diaboliko Моя переменная ARRAY является параметрической переменной, и я должен читать ее как массив. Я не уверен, что вы имеете в виду. - person michael.hor257k; 16.11.2015
comment
Я уверен... Я РЕШИЛ с этим: ‹xsl:variable name=columns select=ext:node-set($inline-array)/*/› Спасибо все равно, хватило просто поискать получше - person Diaboliko; 17.11.2015
comment
Пожалуйста, @Diaboliko сделайте свой комментарий в качестве ответа, чтобы помочь другим, таким как я, получить массив таким образом. - person Gueorgui Obregon; 28.04.2016
comment
‹xsl:имя переменной=столбцы select=ext:node-set($inline-array)/*/› - person Diaboliko; 13.05.2016