Как я могу использовать xsl: import с переменной в имени пути? - PullRequest
3 голосов
/ 15 апреля 2011

По сути, я хочу сделать это в XSL:

<xsl:include href="_domains/{$domain}/templates/header.xsl" />

Но я не могу использовать переменную ($ domain) в include. Любые предложения по обходу?

Ответы [ 3 ]

5 голосов
/ 15 апреля 2011

xsl:import и xsl:include разрешаются во время компиляции и не поддерживают расширение во время выполнения.

Кроме того, если вы используете XSLT 2.0, вы можете использовать условное включение с use-when, если у вас есть выражение, которое может быть оценено в статическом контексте.

1 голос
/ 15 апреля 2011

Как объясняется @lavinio, в XSLT 2.0 атрибут use-when может использоваться для обеспечения определенной степени включения во время компиляции инструкции xslt, однакоэто ограничено только условиями тестирования, которые могут быть определены из значений в статическом контексте и из этих значений динамического контекста: текущей даты и времени и неявного часового пояса.

Другой подход - для загрузки таблицы стилей XSLT (в виде XML-документа) во время выполнения и перед началом преобразования для динамической установки атрибута href любых требуемых инструкций <xsl:include> и / или <xsl:import>.

Этот метод используетсявизуализатором XPath для динамического изменения таблицы стилей XSLT, которая затем оценивает заданное пользователем выражение XPath и форматирует документ XML со всеми выбранными и видимыми узлами - выделено.

0 голосов
/ 29 марта 2017

С добавлением статических параметров теперь можно условно включить в XSLT 3.0. Статические параметры можно использовать в атрибуте use-when в xsl:include.

Теперь мы можем объявить параметры со значениями по умолчанию false(), а затем переопределить те, которые нам нужны во время выполнения ...

<xsl:param name="someparam" as="xs:boolean" select="false()" 
  static="yes" required="no"/>  
<xsl:include href="include_me.xsl" use-when="$someparam"/>

Вот полный рабочий пример, протестированный с Saxon-HE v9.7 (также протестированный с Saxon-PE 9.5).

Ввод XML (test.xml)

<doc>
    <foo/>
</doc>

Основной XSLT 3.0 (test_main.xsl)

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:param name="inc1" as="xs:boolean" select="false()" 
    static="yes" required="no"/>
  <xsl:param name="inc2" as="xs:boolean" select="false()" 
    static="yes" required="no"/>

  <xsl:include href="test_inc1.xsl" use-when="$inc1"/>
  <xsl:include href="test_inc2.xsl" use-when="$inc2"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Первый возможный включенный XSLT 3.0 (test_inc1.xsl)

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="foo">
    <xsl:copy>INCLUDE FILE 1!!!</xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Второй возможный включенный XSLT 3.0 (test_inc2.xsl)

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="foo">
    <xsl:copy>INCLUDE FILE 2!!!</xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Командная строка (установка inc2 в true)

java -cp "saxon9he.jar" net.sf.saxon.Transform -s:"test.xml" -xsl:"test_main.xsl" inc2="true"

выход

<doc>
   <foo>INCLUDE FILE 2!!!</foo>
</doc>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...