<xsl:next-match> XSLT

Элемент xsl:next-match приказывает процессору XSLT выбрать шаблон с приоритетом на один уровень ниже, чем у текущего шаблона. Напоминает <xsl:apply-imports>, однако <xsl:next-match> работает со всеми шаблонами, включая шаблоны из главной таблицы стилей и из всех включаемых и импортируемых таблиц. При помощи <xsl:next-match> можно строить шаблоны, действующие по аналогии с переопределением методов в объектно-ориентированных языках.

Элементы-потомки:

Синтаксис

XSLT 2.0 и XSLT 3.0

<xsl:next-match>
    <!-- Content: (xsl:with-param | xsl:fallback)* -->
</xsl:next-match>

Содержимое

Произвольное количество элементов <xsl:with-param> и <xsl:fallback>.

Описание и примеры

Пример

В этом примере создаются шаблоны для обработки следующего документа HTML:

<!-- element-discussion.html -->
<html>
    <head>
        <title>Interesting new XSLT elements</title>
    </head>
    <body>
        <h1>Interesting new XSLT elements</h1>
        <p>XSLT 2.0 has lots of interesting new elements. We'll mention a couple of them here. </p>
        <h1>The <code>&lt;xsl:next-match&gt;</code> element</h1>
        <p>One of the most interesting new elements in XSLT 2.0 is <code>&lt;xsl:next-match&gt;</code>. </p>
        <h1>The <code>&lt;xsl:perform-sort&gt;</code> element</h1>
        <p>Don't forget about <code>&lt;xsl:perform-sort&gt;</code>, though. It's very interesting as well.</p>
    </body>
</html>

В данном документе присутствуют элементы HTML <code>. Одни из них находятся в элементах <h1>, другие – в элементах <p>. Для демонстрации применения <xsl:next-match> мы определим два разных шаблона, обрабатывающих элементы <code>. Базовый шаблон выводит текст элемента моноширинным шрифтом; переопределяющий шаблон изменяет цвет элемента <code>, если он находится в элементе <h1>. Таблица стилей выглядит так:

<?xml version="1.0"?>
<!-- next-match.xsl -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <xsl:template match="html">
        <html>
            <head>
                <title>
                    <xsl:value-of select="head/title"/>
                </title>
            </head>
        <body style="font-family: sans-serif;">
            <xsl:apply-templates select="body/*"/>
        </body>
        </html>
    </xsl:template>
    <xsl:template match="h1/code">
        <span style="color: red;">
            <xsl:next-match/>
        </span>
    </xsl:template>
    <xsl:template match="code">
        <span style="font-family: monospace;">
            <xsl:apply-templates select="*|text()"/>
        </span>
    </xsl:template>
    <xsl:template match="h1">
        <h1>
            <xsl:apply-templates select="*|text()"/>
        </h1>
    </xsl:template>
    <xsl:template match="p">
        <p>
            <xsl:apply-templates select="*|text()"/>
        </p>
    </xsl:template>
</xsl:stylesheet>

Ключом к использованию <xsl:next-match> являются разные приоритеты задействованных шаблонов. В приведенном примере они определяются правилами приоритетов XSLT по умолчанию. Конкретное правило обладает более высоким приоритетом, чем более общее правило, поэтому самым высокоприоритетным правилом для элемента <code> в элементе <h1> является шаблон match="h1/code". Элемент <xsl:next-match> в шаблоне активизирует следующий шаблон в порядке приоритетов, а именно шаблон match="code".

В соответствии с нашей таблицей стилей по умолчанию для элемента <code> создается элемент <span> с моноширинным шрифтом. Более конкретный (а следовательно, более высокоприоритетный) шаблон создает элемент <span> с красным цветом шрифта.

Если потребуется назначить другой шрифт всем элементам <code>, достаточно изменить шаблон match="code", в котором задается свойство font-family. Результат применения таблицы стилей:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Interesting new XSLT elements</title>
    </head>
    <body style="font-family: sans-serif;">
        <h1>Interesting new XSLT elements</h1>
        <p>XSLT 2.0 has lots of interesting new elements. We'll mention a couple of them here.</p>
        <h1>The <span style="color: red;"><span style="font-family: monospace;">&lt;xsl:next-match&gt;</span></span> element</h1>
        <p>One of the most interesting new elements in XSLT 2.0 is <span style="font-family: monospace;">&lt;xsl:next-match&gt;</span>.</p>
        <h1>The <span style="color: red;"><span style="font-family: monospace;">&lt;xsl:perform-sort&gt;</span></span> element</h1>
        <p>Don't forget about <span style="font-family: monospace;">&lt;xsl:perform-sort&gt;</span>, though. It's very interesting as well.</p>
    </body>
</html>