Параметры таблицы стилей XSLT в импортированных таблицах стилей - PullRequest
14 голосов
/ 19 января 2012

Можно ли присвоить значение параметру импортированной таблицы стилей?

Я ожидал что-то вроде

<xsl:import ... >
  <xsl:with-param ... 
</xsl:import>

, но это недопустимо.

Также tunnel = "yes" запрещено в параметрах таблицы стилей.

Ответы [ 4 ]

18 голосов
/ 21 января 2012

Попробуйте:

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: в импортируемой таблице стилей может переопределить xsl: paramв импортированной таблице стилей, и это эффективно устанавливает значение параметра.

4 голосов
/ 19 января 2012

Быстрый взгляд на спецификации показывает, что такая конструкция не разрешена:

Короче говоря, 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 (переопределение по умолчанию из импортированного листа).

2 голосов
/ 20 января 2012

Может быть, это тоже полезно:

В XSLT 2.0 можно передавать параметры в переопределенный шаблон в импортированной таблице стилей и создавать его экземпляры из переопределенного шаблона с помощью : <xsl:apply-imports>.

Передача параметров с помощью <xsl:apply-imports> является функцией только XSLT 2.0 - это невозможно в XSLT 1.0.

1 голос
/ 20 января 2012

Просто чтобы добавить к отличному ответу 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>

пример командной строки саксонской (установка нового значения параметра)

java -cp "saxon9.jar" net.sf.saxon.Transform -s:input.xml -xsl:main.xsl -o:output.xml param="kuba"

output.xml

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