<xsl:strip-space elements='e t:*'
xmlns:t='urn:d'/>
<xsl:template match='/'>
<xsl:copy-of select='/'/>
</xsl:template>
</xsl:stylesheet>
<?xml version='1.0' encoding='utf-8'?><a xmlns:d='urn:d'>¶
□□<d:b><c>¶
□□□□□□<e/>¶
□□□□</c></d:b>¶
</a>
Сообщения процессора
По большому счету, мы не можем контролировать процесс преобразования. Процессор может сам выбирать, как и в какой последовательности он будет выполнять те или иные шаблоны — таковы особенности декларативного программирования. Вместе с тем мы все-таки можем получить кое-какую информацию о ходе преобразования, используя механизм, называемый в XSLT сообщениями.
Элемент
Синтаксис этого элемента дан ниже:
<xsl:message
terminate='yes' | 'no'>
<!-- Содержимое: шаблон -->
</xsl:message>
Элемент xsl:message
указывает процессору на то, что он должен вывести сообщение, которое является результатом обработки шаблона, содержащегося в этом элементе. Механизм вывода сообщения зависит от реализации того или иного процессора и может быть различным — от вывода текста сообщения на экран до вызова внешнего модуля для обработки сообщения.
Иногда в процессе отладки преобразования бывает полезно выводить сообщения о том, какой элемент обрабатывается в данный момент.
<a><b><c><d/></c></b></a>
<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>
<element name='a'>
<element name='b'>
<element name='c'>
<element name='d'/>
</element>
</element>
</element>
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'
, то процессор, выведя сообщение, прервет обработку. Этот прием может использоваться, например, для того, чтобы проверять входящие документы на соответствие определенной схеме.
При помощи xsl:message
мы можем запретить обработку документов, которые не имеют в корне элемент с именем 'html'
в любом регистре символов.
<xsl:template match='/'>
<xsl:if test='translate(name(*),'html','HTML')!='HTML''>
<xsl:message terminate='yes'>
<xsl:text>Document has no root HTML element.</xsl:text>
</xsl:message>
</xsl:if>
</xsl:template>
Если мы будем обрабатывать документ вида
<hTmL>
<body/>
</hTmL>