Параметры таблицы стилей XSLT в импортированных таблицах стилей
Можно ли присвоить значение параметру импортированной таблицы стилей?
Я ожидал чего-то вроде
<xsl:import ... >
<xsl:with-param ...
</xsl:import>
но это недопустимо.
Также туннель = "да" запрещен в параметрах стилей.
Ответы
Ответ 1
Попробуйте следующее:
main.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="import.xsl"/>
<xsl:variable name="param" select="'some-value'"/>
<xsl:template match="/">
<xsl:call-template name="foo"/>
</xsl:template>
</xsl:stylesheet>
import.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="param" select="'default'"/>
<xsl:template name="foo">
<out><xsl:value-of select="$param"/></out>
</xsl:template>
</xsl:stylesheet>
Переменная xsl: variable в таблице стилей импорта может переопределить параметр xsl: param в импортированной таблице стилей, и это эффективно устанавливает значение параметра.
Ответ 2
Быстрый взгляд на спецификации показывает, что такая конструкция не разрешена:
Короче говоря, href
- единственный разрешенный атрибут, и в теле элемента нет содержимого.
Однако, если я понимаю ваш случай использования, то вы должны просто установить параметр обычным способом (используя ваш язык хоста). Не имеет значения, что он был определен в импортированной таблице стилей. Например, предположим, что у вас есть эта таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="import.xsl"/>
<xsl:template match="/">
<xsl:value-of select="$test"/>
</xsl:template>
</xsl:stylesheet>
Что импортирует это:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="test" select="'default'"/>
</xsl:stylesheet>
... тогда настройка параметра test
нормальным образом должна работать. Обратите внимание, что вы также можете "замаскировать" параметр из импортированного листа, если хотите предоставить новое значение по умолчанию.
Итак, добавив это в первую таблицу стилей:
<xsl:param name="test" select="'default2'"/>
... приведет к печати default2
(переопределение значения по умолчанию из импортированного листа).
Ответ 3
Возможно, это также полезно:
В XSLT 2.0 можно передать параметры для переопределенного шаблона в импортированной таблице стилей и создать экземпляр из шаблона переопределения с помощью: <xsl:apply-imports>
.
Передача параметров с помощью <xsl:apply-imports>
является функцией только XSLT 2.0 - это невозможно в XSLT 1.0.
Ответ 4
Просто чтобы добавить к lwburk отличный ответ (+1), вот еще один пример присвоения значения параметру в импортированной таблице стилей.
Вам не нужно добавлять xsl:param
в основную таблицу стилей; вы просто назначили значение при вызове таблицы стилей (например, в командной строке).
main.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="import.xsl"/>
<xsl:template match="/">
<xsl:call-template name="foo"/>
</xsl:template>
</xsl:stylesheet>
import.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="param" select="'default'"/>
<xsl:template name="foo">
<out><xsl:value-of select="$param"/></out>
</xsl:template>
</xsl:stylesheet>
пример командной строки saxon (установка нового значения параметра)
java -cp "saxon9.jar" net.sf.saxon.Transform -s:input.xml -xsl:main.xsl -o:output.xml param="kuba"
output.xml
<out>kuba</out>