Обработка массива как переменной с помощью XSLT - PullRequest
2 голосов
/ 18 мая 2011

Я объявил переменную в моем 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 ]

3 голосов
/ 18 мая 2011

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

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

<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

2 голосов
/ 18 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...