Чтение онлайн

ЖАНРЫ

Холзнер Стивен

Шрифт:

<PLANET>

 <NAME>Venus</NAME>

 <MASS UNITS>"(Earth = 1)">.815</MASS>

 <DAY UNITS="days">116.75</DAY>

 <RADIUS UNITS="miles">3716</RADIUS>

 <DENSITY UNITS="(Earth = 1)">.943</DENSITY>

 <DISTANCE UNITS="million miles">66.8</DISTANCE><!--B перигелии-->

</PLANET>

Чтобы извлечь комментарии и поместить их в

элементы
<COMMENT>
, я включил правило только для комментариев (листинг 4.3).

Листинг 4.3. Выбор комментариев

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:template match="PLANETS">

<HTML>

<xsl:apply-templates/>

</HTML>

 </xsl:template>

 <xsl:template match="comment">

<COMMENT>

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

</COMMENT>

 </xsl:template>

</xsl:stylesheet>

Вот результат для Венеры, в котором комментарий преобразован в элемент

<COMMENT>
:

Venus

.815

116.75

3716

.943

66.8<COMMENT>B перигелии</СОММЕNT>

Обратите внимание: здесь текст для других элементов в элементе

<PLANET>
также включается в выходной документ, потому что так установлено в соответствии с правилом по умолчанию для каждого элемента. Поскольку для элементов я не предоставил какого-либо правила, их текст просто включается в выходной документ.

Выбор узлов при помощи node

В образце условие узла

node
выбирает любой узел, за исключением корневого узла — помните, что в действительности это
child::node
. Предположим, мы хотим создать таблицу стилей, копирующую произвольный документ XML, используя
<xsl:copy>
. (В главе 3 для этого применялся элемент
<xsl:copy-of>
.) Можно начать так, как показано в следующем примере. В этом случае в применяемом шаблоне для выбора любого элемента или любого атрибута используется операция OR, с которой мы познакомимся позже в этой главе (этот шаблон фактически выбирает себя — для того чтобы продолжать копирование на много уровней вглубь):

<?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:apply-templates select="@*|*"/>

</xsl:copy>

 </xsl:template>

</xsl:stylesheet>
 

Однако

посмотрите на результат — обратите внимание на то, что в этой версии, выбирающей только элементы и атрибуты (
@*|*
), не копируются узлы-разделители и текстовые узлы:

<?xml version="1.0" encoding="UTF-8"?>

<PLANETS><PLANET><NAME/><MASS UNITS="(Earth = 1)"/><DAY UNITS="days"/><RADIUS UNITS="miles"/><DENSITY UNITS="(Earth = 1)"/><DISTANCE UNITS="million miles"/></PLANET><PLANET><NAME/><MASS UNITS="(Earth = 1)"/><DAY UNITS="days"/><RADIUS UNITS="miles"/><DENSITY UNITS="(Earth = 1)"/><DISTANCE UNITS="million miles"/></PLANET><PLANET><NAME/><MASS UNITS="(Earth = 1)"/><DAY UNITS="days"/><RADIUS UNITS="miles"/><DENSITY UNITS="(Earth = 1)"/><DISTANCE UNITS="million miles"/> </PLANET></PLANETS>

Это, конечно, неполно. Если я, с другой стороны, буду выбирать по образцу "

@*|node
" вместо "
@*|*
", новое правило шаблона выберет все узлы за исключением корневого узла (который создается в результирующем дереве автоматически), поэтому символы-разделители будут скопированы, так же как и текст (листинг 4.4).

Листинг 4.4. Копирующая таблица стилей

<?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="@*|node">

<xsl:copy>

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

</xsl:copy>

 </xsl:template>

</xsl:stylesheet>

Новый результат:

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xml" href="#"?>

<PLANETS>

 <PLANET>

<NAME>Mercury</NAME>

<MASS UNITS="(Earth = 1)">.0553</MASS>

<DAY UNITS="days">58.65</DAY>

<RADIUS UNITS="miles">1516</RADIUS>

<DENSITY UNITS="(Earth = 1)">.983</DENSITY>

<DISTANCE UNITS="million miles">43.4</DISTANCE><!--B перигелии-->

 </PLANET>

 <PLANET>

<NAME>Venus</NAME>

<MASS UNITS="(Earth = 1)">.815</MASS>

<DAY UNITS="days">116.75</DAY>

<RADIUS UNITS="miles">3716</RADIUS>

<DENSITY UNITS="(Earth = 1)">.943</DENSITY>

Поделиться с друзьями: