</PLANET>
<PLANET>
<NAME>Earth</NAME>
<MASS UNITS="(Earth = 1)">1</MASS>
<DAY UNITS="days">1</DAY>
<RADIUS UNITS="miles">2107</RADIUS>
<DENSITY UNITS="(Earth = 1)">1</DENSITY>
<DISTANCE UNITS="million miles">128.4</DISTANCE>
</PLANET>
</PLANETS>
Но есть более простой путь проверить, что копируются все дочерние узлы, атрибуты и другие потомки узлов: вместо элемента <xsclass="underline" copy> можно применить <xsclass="underline" copy-of>.
ГЛУБОКОЕ КОПИРОВАНИЕ
Пример использования <xsclass="underline" copy> для осуществления глубокого копирования документа будет приведен в главе 4, в которой описывается функция узла и объясняется, как рекурсивно вызывать один и тот же шаблон.
Элемент <xsclass="underline" copy-of>
Элемент <xsclass="underline" copy-of> позволяет осуществлять глубокое копирование узлов, при котором копируется не только узел, но и все его атрибуты и потомки. У этого элемента единственный атрибут:
• select (обязательный). Узел или набор копируемых узлов. Этот элемент пуст и не имеет содержимого.
Ниже приведен пример работы этого элемента; в этом случае я заменил в листинге 3.10 элемент <xsclass="underline" for-each> элементом <xsclass="underline" copy-of>, который явно выбирает для копирования все атрибуты контекстного элемента.
Листинг 3.11. Применение <copy-of><?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" output method="xml"/>
<xsclass="underline" template match="*">
<xsclass="underline" copy>
<xsclass="underline" copy-of select="@*"/>
<xsclass="underline" apply-templates/>
</xsclass="underline" copy>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Этот код работает так же, как и предыдущий пример, копируя все элементы и атрибуты. С другой стороны, можно вообще обойтись без каких-либо изменений в листинге 3.10, — я могу просто использовать <xsclass="underline" copy-of> для того, чтобы скопировать весь документ, выбрав корневой узел и скопировав всех его потомков:
<?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" output method="xml"/>
<xsclass="underline" template match="/">
<xsclass="underline" copy-of select="*"/>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
При помощи <xsclass="underline" copy-of> можно также копировать конкретные узлы и их потомков вместо того, чтобы задавать подстановку *. Например, следующее правило копирует все элементы <MASS> и их потомков:
<xsclass="underline" template match="MASS">
<xsclass="underline" copy-of select="."/>
</xsclass="underline" template>
По этой причине я могу заменить элемент <MASS> на элемент <DAY>:
<xsclass="underline" template match="MASS">
<xsclass="underline" copy-of select="DAY"/>
</xsclass="underline" template>
Элемент <xsclass="underline" message>
При помощи элемента <xsclass="underline" message> можно дать указание процессору XSLT отобразить сообщение и, по выбору, прекратить обработку таблицы стилей. У элемента <xsclass="underline" message> один атрибут:
• terminate (необязательный). Значение «yes» прекращает обработку. По умолчанию установлено «no».
Куда на самом деле будет отправлено сообщение, зависит от процессора XSLT. Для процессоров, основанных на Java, сообщение обычно отправляется в выходной поток ошибок Java, которому соответствует экран компьютера, если процессор XSLT был вызван из командной строки. Другие процессоры XSLT могут выводить сообщения во всплывающие окна или в web-страницы, отправляемые в браузеры.
В приведенном ниже листинге 3.12 я прекращаю обработку XSLT, когда процессор XSLT пытается преобразовать элемент <DAY> в planets.xml, выводя сообщение "Sorry, DAY information is classified." (Извините, информация о параметре «ДЕНЬ» засекречена.).
Листинг 3.12. Применение <xsclass="underline" message><?xml version="1.0"?>
<xsclass="underline" stylesheet version="l.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" 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>
<xsclass="underline" apply-templates/>
</TABLE>
</BODY>
</HTML>
</xsclass="underline" template>
<xsclass="underline" template match="PLANET">
<TR>
<TD><xsl value-of select="NAME"/></TD>
<TD><xsclass="underline" apply-templates select="MASS"/></TD>
<TD><xsclass="underline" apply-templates select="RADIUS"/></TD>
<TD><xsclass="underline" apply-templates select="DAY"/></TD>
</TR>
</xsclass="underline" template>
<xsclass="underline" template match="MASS">
<xsclass="underline" value-of select="."/>
<xsclass="underline" text> </xsclass="underline" text>
<xsclass="underline" value-of select="@UNITS"/>
</xsclass="underline" template>
<xsclass="underline" template match="RADIUS">
<xsclass="underline" value-of select="."/>
<xsclass="underline" text> </xsclass="underline" text>
<xsclass="underline" value-of select="@UNITS"/>
</xsclass="underline" template>
<xsclass="underline" template match="DAY">
<xsclass="underline" message terminate="yes">
Sorry. DAY information is classified.
</xsclass="underline" message>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Вот результаты применения этой таблицы стилей в Xalan: