Обработка массива как переменной с помощью 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.
Во-вторых, я думаю, что нам нужно взглянуть на дизайн таблицы стилей, и мы не сможем сделать это без описания проблемы, которую вы пытаетесь решить (в отличие от ваших попыток решения).