Валиков Алексей Н.
Шрифт:
Листинг 8.2. Входящий документ
<а xmlns:d="urn:d">¶
□□<d:b>¶
□□□□<c>¶
□□□□□□</e>¶
□□□□</c>¶
□□</d:b>¶
</a>
Листинг 8.3. Преобразование
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:preserve-space elements="c"/>
<xsl:strip-space elements="e t:*"
xmlns:t="urn:d"/>
<xsl:template match="/">
<xsl:copy-of select="/"/>
</xsl:template>
</xsl:stylesheet>
Листинг 8.4. Выходящий документ
<?xml version="1.0" encoding="utf-8"?><a xmlns:d="urn:d">¶
□□<d:b><c>¶
□□□□□□<e/>¶
□□□□</c></d:b>¶
</a>
Сообщения процессора
По большому счету, мы не можем контролировать процесс преобразования. Процессор может сам выбирать, как и в какой последовательности он будет выполнять те или иные шаблоны — таковы особенности декларативного программирования. Вместе с тем мы все-таки можем получить кое-какую информацию о ходе преобразования, используя механизм, называемый в XSLT сообщениями.
Элемент xsl:message
Синтаксис этого элемента дан ниже:
<xsl:message
terminate="yes" | "no">
<!-- Содержимое: шаблон -->
</xsl:message>
Элемент
xsl:message
указывает процессору на то, что он должен вывести сообщение, которое является результатом обработки шаблона, содержащегося в этом элементе. Механизм вывода сообщения зависит от реализации того или иного процессора и может быть различным — от вывода текста сообщения на экран до вызова внешнего модуля для обработки сообщения. Пример
Иногда в процессе отладки преобразования бывает полезно выводить сообщения о том, какой элемент обрабатывается в данный момент.
Листинг 8.5. Входящий документ
<a><b><c><d/></c></b></a>
Листинг 8.6. Преобразование
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
<element name="{name}">
<xsl:message>
<xsl:text>Processing element </xsl:text>
<xsl:value-of select="name"/>
<xsl:if test="parent::*">
<xsl:text> which has a parent element </xsl:text>
<xsl:value-of select="name(..)"/>
</xsl:if>
<xsl:text>.</xsl:text>
</xsl:message>
<xsl:apply-templates/>
</element>
</xsl:template>
</xsl:stylesheet>
Листинг 8.7. Выходящий документ
<element name="a">
<element name="b">
<element name="c">
<element name="d"/>
</element>
</element>
</element>
Листинг 8.8. Сообщения процессора
Processing element a.
Processing element b which has a parent element a.
Processing element с which has a parent element b.
Processing element d which has a parent element c.
Атрибут
terminate
указывает на то, должен ли процессор прекратить дальнейшую обработку документа или нет. Значением этого атрибута по умолчанию является "no"
, что означает, что процессор должен просто вывести сообщения и продолжать дальнейшее выполнение шаблона. Если же в xsl:message
указано terminate="yes"
, то процессор, выведя сообщение, прервет обработку. Этот прием может использоваться, например, для того, чтобы проверять входящие документы на соответствие определенной схеме.