Перейти к содержанию

xsl:apply-imports

Элемент xsl:apply-imports используется в шаблонах для применения правил, которые были импортированы во внешних модулях, но переопределены шаблонами основного преобразования.

Синтаксис

1
<xsl:apply-imports />

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

При обработке стиля в каждой точке имеется некое текущее правило шаблона. Всякий раз, когда по образцу выбирается правило шаблона, для обработки оно становится текущим правилом шаблона. Когда обрабатывается элемент xsl:for-each, то при обработке содержимого этого элемента xsl:for-each текущее правило шаблона становится нулевым.

xsl:apply-imports обрабатывает текущий узел используя лишь те правила шаблона, которые были импортированы в тот элемент стиля, где это текущее правило шаблона находится. Узел обрабатывается в режиме текущего правила шаблона. Если xsl:apply-imports обрабатывается когда текущее правило шаблона нулевое, фиксируется ошибка.

Пример 1

Предположим что стиль doc.xsl содержит правило шаблона для элементов example:

1
2
3
4
5
<xsl:template match="example">
  <pre>
    <xsl:apply-templates />
  </pre>
</xsl:template>

Другой стиль может импортировать doc.xsl и поменять обработку элементов example следующим образом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:import href="doc.xsl" />
  <xsl:template match="example">
    <div style="border: solid red">
      <xsl:apply-imports />
    </div>
  </xsl:template>
</xsl:stylesheet>

В результате суммарного действия example должен преобразовываться в элемент следующего вида:

1
2
3
<div style="border: solid red">
  <pre>...</pre>
</div>

Пример 2

Предположим, что в преобразованиях часто используется шаблон, который заменяет элементы home ссылками на сайт http://www.xsltdev.ru:

1
2
3
<xsl:template match="home">
  <a href="http://www.xsltdev.ru/">www.xsltdev.ru</a>
</xsl:template>

При необходимости этот шаблон может быть переопределен. К примеру, ссылка может выглядеть так: Visit <a href="https://www.xsltdev.ru/">www.xsltdev.ru</a>. Соответственно, шаблон будет иметь вид:

1
2
3
4
<xsl:template match="home">
  <xsl:text>Visit</xsl:text>
  <a href="https://www.xsltdev.ru/">www.xsltdev.ru</a>
</xsl:template>

Можно заметить, что оба шаблона имеют общую часть, которая выводит гипертекстовую ссылку. Эта часть может быть выведена во внешнее преобразование home.xsl:

1
2
3
4
5
6
7
8
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:template match="home">
    <a href="https://www.xsltdev.ru/">www.xsltdev.ru</a>
  </xsl:template>
</xsl:stylesheet>

Для того чтобы использовать внешний шаблон, основное преобразование должно импортировать его при помощи xsl:import и применять посредством xsl:apply-imports:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:import href="home.xsl" />
  <xsl:template match="home">
    <xsl:text>Visit</xsl:text>
    <xsl:apply-imports />
  </xsl:template>
</xsl:stylesheet>

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

Пример 3

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?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>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?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>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?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>
1
2
3
4
5
6
7
Some binary operations

1+2 = 12 (from str.xsl)

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

1*2 = 21 (from str.xsl)

Пример 4

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
<catalog>
  <book id="bk101">
    <title>XML Developer's Guide</title>
    <author>Gambardella, Matthew</author>
    <genre>Computer</genre>
    <price>44.95</price>
    <publish_date>2000-10-01</publish_date>
    <description>
      An in-depth look at creating applications with XML.
    </description>
  </book>
  <book id="bk102">
    <title>Midnight Rain</title>
    <author>Ralls, Kim</author>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-12-16</publish_date>
    <description>
      A former architect battles corporate zombies, an evil
      sorceress, and her own childhood to become queen of
      the world.
    </description>
  </book>
  <book id="bk103">
    <title>Maeve Ascendant</title>
    <author>Corets, Eva</author>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-11-17</publish_date>
    <description>
      After the collapse of a nanotechnology society in
      England, the young survivors lay the foundation for a
      new society.
    </description>
  </book>
  <book id="bk104">
    <title>Oberon's Legacy</title>
    <author>Corets, Eva</author>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2001-03-10</publish_date>
    <description>
      In post-apocalypse England, the mysterious agent known
      only as Oberon helps to create a new life for the
      inhabitants of London. Sequel to Maeve Ascendant.
    </description>
  </book>
  <book id="bk105">
    <title>The Sundered Grail</title>
    <author>Corets, Eva</author>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2001-09-10</publish_date>
    <description>
      The two daughters of Maeve, half-sisters, battle one
      another for control of England. Sequel to Oberon's
      Legacy.
    </description>
  </book>
  <book id="bk106">
    <title>Lover Birds</title>
    <author>Randall, Cynthia</author>
    <genre>Romance</genre>
    <price>4.95</price>
    <publish_date>2000-09-02</publish_date>
    <description>
      When Carla meets Paul at an ornithology conference,
      tempers fly as feathers get ruffled.
    </description>
  </book>
  <book id="bk107">
    <title>Splish Splash</title>
    <author>Thurman, Paula</author>
    <genre>Romance</genre>
    <price>4.95</price>
    <publish_date>2000-11-02</publish_date>
    <description>
      A deep sea diver finds true love twenty thousand
      leagues beneath the sea.
    </description>
  </book>
  <book id="bk108">
    <title>Creepy Crawlies</title>
    <author>Knorr, Stefan</author>
    <genre>Horror</genre>
    <price>4.95</price>
    <publish_date>2000-12-06</publish_date>
    <description>
      An anthology of horror stories about roaches,
      centipedes, scorpions  and other insects.
    </description>
  </book>
  <book id="bk109">
    <title>Paradox Lost</title>
    <author>Kress, Peter</author>
    <genre>Science Fiction</genre>
    <price>6.95</price>
    <publish_date>2000-11-02</publish_date>
    <description>
      After an inadvertant trip through a Heisenberg
      Uncertainty Device, James Salway discovers the
      problems of being quantum.
    </description>
  </book>
  <book id="bk110">
    <title>Microsoft .NET: The Programming Bible</title>
    <author>O'Brien, Tim</author>
    <genre>Computer</genre>
    <price>36.95</price>
    <publish_date>2000-12-09</publish_date>
    <description>
      Microsoft's .NET initiative is explored in detail in
      this deep programmer's reference.
    </description>
  </book>
  <book id="bk111">
    <title>MSXML3: A Comprehensive Guide</title>
    <author>O'Brien, Tim</author>
    <genre>Computer</genre>
    <price>36.95</price>
    <publish_date>2000-12-01</publish_date>
    <description>
      The Microsoft MSXML3 parser is covered in detail, with
      attention to XML DOM interfaces, XSLT processing, SAX
      and more.
    </description>
  </book>
  <book id="bk112">
    <title>Visual Studio 7: A Comprehensive Guide</title>
    <author>Galos, Mike</author>
    <genre>Computer</genre>
    <price>49.95</price>
    <publish_date>2001-04-16</publish_date>
    <description>
      Microsoft Visual Studio 7 is explored in depth,
      looking at how Visual Basic, Visual C++, C#, and ASP+
      are integrated into a comprehensive development
      environment.
    </description>
  </book>
</catalog>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?xml version="1.0" ?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
>
  <xsl:import href="sample-import.xsl" />
  <xsl:output method="html" />
  <xsl:template match="book">
    <font face="Arial">
      <xsl:apply-imports />
    </font>
  </xsl:template>
</xsl:stylesheet>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" ?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
>
  <!-- Override built-in template. -->
  <xsl:template match="text()" />
  <xsl:template match="/">
    <html>
      <body>
        <xsl:apply-templates />
      </body>
    </html>
  </xsl:template>
  <xsl:template match="book">
    <i>
      <xsl:apply-templates select="title" />
    </i>
    <xsl:text>By:</xsl:text>
    <xsl:apply-templates select="author" />
    <br />
  </xsl:template>
  <xsl:template match="title">
    <b>
      <xsl:value-of select="." />
    </b>
  </xsl:template>
  <xsl:template match="author">
    <font color="blue">
      <xsl:value-of select="." />
    </font>
  </xsl:template>
</xsl:stylesheet>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<html>
  <body>
    <font face="Arial"
      ><i><b>XML Developer's Guide</b></i> By:
      <font color="blue">Gambardella, Matthew</font><br
    /></font>
    <font face="Arial"
      ><i><b>Midnight Rain</b></i> By:
      <font color="blue">Ralls, Kim</font><br
    /></font>
    ...
    <font face="Arial"
      ><i><b>Visual Studio 7: A Comprehensive Guide</b></i>
      By: <font color="blue">Galos, Mike</font><br
    /></font>
  </body>
</html>

См. также

  • xsl:import — импорт преобразований

Ссылки

Комментарии