Параметры таблицы стилей 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>