Вход/Регистрация
Технология XSLT
вернуться

Валиков Алексей Н.

Шрифт:

 ...

</xsl:template>

то обрабатываться им будут все элементы, локальные части имен которых начинаются на

"чеб"
(например,
"чебуреки"
,
"Чебоксары"
,
"чебурашка"
).

Следующее преобразование демонстрирует, как при помощи функции

local-name
и ключей сосчитать количество элементов и атрибутов документа с различными именами.

Листинг 11.4. Входящий документ

<foo bar="1">

 <bar foo="2"/>

 <bar bar="3"/>

 <foo foo="4">

<bar bar="5"/>

<bar foo="6"/>

 </foo>

</foo>

Листинг 11.5. Преобразование

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <!-- Выводим информацию в текстовом виде -->

 <xsl:output method="text"/>

 <!--

| Создаем ключ, отображающий узлы атрибутов и элементов

| в их локальные части имен.

+-->

 <xsl:key name="node" match="*" use="local-name"/>

 <xsl:key name="node" match="@*" use="local-name"/>

 <xsl:template match="*|@*">

<xsl:variable name="name" select="local-name"/>

<!--

| Если узел является первым узлом группы (первым встретившимся

| узлом документа с данным именем), выводим информацию о

| количестве узлов в группе (количество узлов с таким же именем).

+-->

<xsl:if test="generate-id(.) = generate-id(key('node', $name))">

<xsl:text>Node '</xsl:text>

<xsl:value-of select="local-name"/>

<xsl:text>' found </xsl:text>

<xsl:value-of select="count(key('node', $name))"/>

<xsl:text> times.&#xA;</xsl:text>

</xsl:if>

<!-- Рекурсивно обрабатываем дочерний элемент и атрибуты -->

<xsl:apply-templates select="*|@*"/>

 </xsl:template>

</xsl:stylesheet>

Листинг 11.6. Выходящий документ

Node 'foo' found 5 times.

Node 'bar' found 7 times.

Именованный шаблон как функция

Сложно переоценить возможности механизмов расширений языка XSLT. Они позволяют сочетать простоту и гибкость обработки XML-документов при помощи элементов XSLT и выражений XPath. Практически любая функция, которая отсутствует в XSLT, может быть написана на подходящем языке программирования и подключена к процессору.

Но как уже отмечалось ранее, функции расширения ограничивают переносимость преобразований. Во-первых, функции расширения одного процессора совсем необязательно будут присутствовать в другом процессоре — скорее наоборот. Во-вторых, не приходится надеяться, что пользовательские модули, написанные на одном языке или с использованием одного интерфейса, смогут использоваться любым процессором. Поэтому часто перед разработчиком стоит проблема решить определенную задачу, используя только стандартные функции и элементы XSLT.

В этом разделе мы рассмотрим возможность использования именованных шаблонов в качестве функций, которые принимают на вход несколько параметров и возвращают некоторое вычисленное значение.

Использование именованных шаблонов как функций обуславливается следующими тезисами.

□ Именованный шаблон можно вызывать вне зависимости от того, какая часть документа обрабатывается в данный момент.

□ Именованному шаблону можно передавать параметры.

□ Результат выполнения именованного шаблона можно присваивать переменной.

  • Читать дальше
  • 1
  • ...
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: