Пример 1 для <xsl:apply-imports>

В данном примере демонстрируется применение элемента <xsl:apply-imports> для более эффективного повторного использования кода.В примере используется четыре основных файла:

  • Исходный XML-файл, ops.xml.Этот файл данных задает три операции: add (+), sub (-) и mul (*).

  • Главная таблица стилей XSLT, ops.xsl.Этот файл содержит правила шаблона для операций, в том числе два элемента <xsl:import>.Импортированные таблицы стилей выполняют арифметические и строковые операции на источнике данных.

  • Импортированная таблица стилей XSLT, arith.xsl.Этот XSLT-файл выполняет арифметические операции на каждом элементе <op>.

  • Еще одна импортированная таблица стилей XSLT, str.xsl.Этот XSLT-файл выполняет заданные пользователем операции над строками.Здесь add (+) интерпретируется как сцепление строк; например, 1+2 превращается в 12.Аналогично mul (*) интерпретируется как обратное объединение; 1*2 превращается в 21.Обратите внимание, что операция sub (-) является неопределенной строковой операцией.

XML-файл (ops.xml)

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="ops.xsl"?>
<ops>
  <desc>Some binary operations</desc>
  <op name="add" symbol="+">
    <operand>1</operand>
    <operand>2</operand>
  </op>
  <op name="sub" symbol="-">
    <operand>1</operand>
    <operand>2</operand>
  </op>
  <op name="mul" symbol="*">
    <operand>1</operand>
    <operand>2</operand>
  </op>
</ops>

Главный XSLT-файл (ops.xsl)

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0">
  <xsl:import href="arith.xsl"/>
  <xsl:import href="str.xsl"/>
  <xsl:template match="op">
    <xsl:value-of select="operand[1]"/>
    <xsl:value-of select="@symbol"/>
    <xsl:value-of select="operand[2]"/>
    = <xsl:apply-imports/>
    <br/>
  </xsl:template>
</xsl:stylesheet>

Импортированный XSLT-файл (arith.xsl)

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0">
  <xsl:template match="op[@symbol='+']">
    <xsl:value-of select="sum(operand)"/> (from arith.xsl)
  </xsl:template>
  <xsl:template match="op[@symbol='-']">
    <xsl:value-of select="number(operand[1])-number(operand[2])"/> 
   (from arith.xsl)
  </xsl:template>
  <xsl:template match="op[@symbol='*']">
    <xsl:value-of select="number(operand[1])*number(operand[2])"/> 
    (from arith.xsl)
  </xsl:template>
</xsl:stylesheet>

Импортированный XSLT-файл (str.xsl)

<?xml version="1.0"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                  version="1.0">
  <xsl:template match="desc">
    <DIV><xsl:value-of select="."/></DIV>
  </xsl:template>
  <xsl:template match="op[@name='add']">
    <xsl:value-of select="operand[1]"/>
    <xsl:value-of select="operand[2]"/> (from str.xsl)
  </xsl:template>
  <xsl:template match="op[@name='mul']">
    <xsl:value-of select="operand[2]"/>
    <xsl:value-of select="operand[1]"/> (from str.xsl)
  </xsl:template>
</xsl:stylesheet>

Вывод

Вывод должен быть следующий:

Some binary operations

1+2 = 12 (from str.xsl)

1-2 = -1 (from arith.xsl)

1*2 = 21 (from str.xsl)

Замечания

Таблица стилей, импортированная последней, имеет наивысший приоритет.В этом примере таблица стилей str.xsl импортируется последней, и поэтому ее приоритет выше, чем у таблицы стилей arith.xsl.Обе импортируемые таблицы стилей содержат шаблоны для операций add и mul.Вызываются только шаблоны из таблицы стилей str.xsl.Однако используется операция sub, заданная в таблице стилей arith.xsl, поскольку в таблице стилей str.xsl операция вычитания не задана.Допустим, порядок элементов <xsl:import> в главном XSLT-файле изменился следующим образом:

<xsl:import href="str.xsl"/>

<xsl:import href="arith.xsl"/>

В этом случае вывод будет следующий:

Some binary operations

1+2 = 3 (from arith.xsl)

1-2 = -1 (from arith.xsl)

1*2 = 2 (from arith.xsl)

Кроме того, если инструкция <xsl:apply-imports/> отсутствует в переопределяющем правиле шаблона <op> в главном XSLT-файле (ops.xsl), вывод будет следующий:

Some binary operations

1+2 =

1-2 =

1*2 =

Иными словами, правило шаблона в импортирующей таблице стилей переопределяет родственные ему правила шаблона в импортируемой таблице стилей.Инструкция <xsl:apply-imports/> позволяет повторно активизировать эти переопределенные правила шаблонов иным образом.