Пример 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/> позволяет повторно активизировать эти переопределенные правила шаблонов иным образом.