Обработка массива как переменной с помощью XSLT

Я объявил переменную в моем XSLT, как указано ниже:

    <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:value-of select="$array[1]" />

Это работает нормально, пока мой встроенный массив имеет статическое содержимое. Но мое требование состоит в том, чтобы динамически назначать значения в XSLT тегу "Item", т.е. Что-то вроде:

<xsl:variable name="inline-array">
    <Item>$item1</Item>
    <Item>$item2</Item>
    <Item>$item3</Item>
</xsl:variable>

Но я перепробовал все возможные варианты без удачи. Любые предложения будут с благодарностью. Любые другие варианты выполнения моего требования также приветствуются. Благодарю.

2 ответа

Решение

Одним из способов достижения этого является использование функции расширения, а именно функции набора узлов, которая возвращает набор узлов из фрагмента результирующего дерева.

Сначала вам нужно будет определить пространство имен для функций расширения следующим образом:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt">

В этом случае я использую функции расширения Microsoft, но другие доступны в зависимости от используемой вами платформы. (http://exslt.org/common - еще один распространенный вариант для платформ, не принадлежащих Microsoft).

Затем вы определяете свой параметр "массива" (или переменную, которую вы хотели), вот так.

<xsl:param name="array" select="msxsl:node-set($inline-array)"/>

Наконец, вы можете получить доступ к этому массиву так

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

Помещение всего этого в простой пример дает вам это

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt">

   <xsl:output method="text" />

   <xsl:variable name="inline-array">
      <Item>
         <xsl:value-of select="$Item1"/>
      </Item>
      <Item>
         <xsl:value-of select="$Item2"/>
      </Item>
      <Item>
         <xsl:value-of select="$Item3"/>
      </Item>
   </xsl:variable>

   <xsl:param name="Item1">1</xsl:param>
   <xsl:param name="Item2">2</xsl:param>
   <xsl:param name="Item3">3</xsl:param>
   <xsl:param name="array" select="msxsl:node-set($inline-array)"/>

   <xsl:template match="/">
      <xsl:value-of select="$array/Item[1]"/>
   </xsl:template>

</xsl:stylesheet>

При запуске это просто выводит следующий результат:

1

Во-первых, вы застряли с XSLT 1.0? Обходные пути, такие как доступ к исходному коду таблицы стилей с помощью document(''), очень редки, если только вы можете перейти на XSLT 2.0.

Во-вторых, я думаю, что нам нужно взглянуть на дизайн таблицы стилей, и мы не сможем сделать это без описания проблемы, которую вы пытаетесь решить (в отличие от ваших попыток решения).

Другие вопросы по тегам