Элемент <xsl:copy-of> позволяет осуществлять глубокое копирование узлов, при котором копируется не только узел, но и все его атрибуты и потомки. У этого элемента единственный атрибут:

• select (обязательный). Узел или набор копируемых узлов. Этот элемент пуст и не имеет содержимого.

Ниже приведен пример работы этого элемента; в этом случае я заменил в листинге 3.10 элемент <xsl:for-each> элементом <xsl:copy-of>, который явно выбирает для копирования все атрибуты контекстного элемента.

Листинг 3.11. Применение <copy-of>

<?xml version='1.0'?>

<xsl:stylesheet version='1.0'

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

 <xsl:output method='xml'/>

 <xsl:template match='*'>

  <xsl:copy>

   <xsl:copy-of select='@*'/>

   <xsl:apply-templates/>

  </xsl:copy>

 </xsl:template>

</xsl:stylesheet>

Этот код работает так же, как и предыдущий пример, копируя все элементы и атрибуты. С другой стороны, можно вообще обойтись без каких-либо изменений в листинге 3.10, — я могу просто использовать <xsl:copy-of> для того, чтобы скопировать весь документ, выбрав корневой узел и скопировав всех его потомков:

<?xml version='1.0'?>

<xsl:stylesheet version='1.0'

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

 <xsl:output method='xml'/>

 <xsl:template match='/'>

  <xsl:copy-of select='*'/>

 </xsl:template>

</xsl:stylesheet>

При помощи <xsl:copy-of> можно также копировать конкретные узлы и их потомков вместо того, чтобы задавать подстановку *. Например, следующее правило копирует все элементы <MASS> и их потомков:

<xsl:template match='MASS'>

 <xsl:copy-of select='.'/>

</xsl:template>

По этой причине я могу заменить элемент <MASS> на элемент <DAY>:

<xsl:template match='MASS'>

 <xsl:copy-of select='DAY'/>

</xsl:template>

Элемент <xsl:message>

При помощи элемента <xsl:message> можно дать указание процессору XSLT отобразить сообщение и, по выбору, прекратить обработку таблицы стилей. У элемента <xsl:message> один атрибут:

• terminate (необязательный). Значение «yes» прекращает обработку. По умолчанию установлено «no».

Куда на самом деле будет отправлено сообщение, зависит от процессора XSLT. Для процессоров, основанных на Java, сообщение обычно отправляется в выходной поток ошибок Java, которому соответствует экран компьютера, если процессор XSLT был вызван из командной строки. Другие процессоры XSLT могут выводить сообщения во всплывающие окна или в web-страницы, отправляемые в браузеры.

В приведенном ниже листинге 3.12 я прекращаю обработку XSLT, когда процессор XSLT пытается преобразовать элемент <DAY> в planets.xml, выводя сообщение 'Sorry, DAY information is classified.' (Извините, информация о параметре «ДЕНЬ» засекречена.).

Листинг 3.12. Применение <xsl:message>

<?xml version='1.0'?>

<xsl:stylesheet version='l.0'

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

 <xsl:template match='/PLANETS'>

  <HTML>

   <HEAD>

    <TITLE>

     The Planets Table

    </TITLE>

   </HEAD>

   <BODY>

    <H1>

     The Planets Table

    </H1>

    <TABLE BORDER='2'>

     <TD>Name</TD>

     <TD>Mass</TD>

     <TD>Radius</TD>

     <TD>Day</TD>

     <xsl:apply-templates/>

    </TABLE>

   </BODY>

  </HTML>

 </xsl:template>

 <xsl:template match='PLANET'>

  <TR>

   <TD><xsl value-of select='NAME'/></TD>

   <TD><xsl:apply-templates select='MASS'/></TD>

   <TD><xsl:apply-templates select='RADIUS'/></TD>

   <TD><xsl:apply-templates select='DAY'/></TD>

  </TR>

 </xsl:template>

 <xsl:template match='MASS'>

  <xsl:value-of select='.'/>

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату