`

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

1 ... 61 62 63 64 65 ... 115 ВПЕРЕД
Перейти на страницу:

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

<?xml-stylesheet type="text/xml" href="planets.xsl"?>

<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><!--В перигелии-->

  <INFO>Sorry, Mercury has blown up and is no longer available.</INFO>

 </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>

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

 </PLANET>

 .

 .

 .

</PLANETS>

Применение оси descendant-or-self

Ось descendant-or-self содержит всех потомков контекстного узла и сам контекстный узел. Заметьте, однако, что она не содержит атрибутов и узлов пространств имен.

В следующем примере (листинг 7.7) демонстрируется работа с осью. В этом случае я создал упрощенную таблицу стилей (подробнее об упрощенных таблицах стилей см. главу 2), которая обрабатывает все элементы с использованием потомков, генерируя уже знакомую нам HTML-таблицу данных о планетах.

Листинг 7.7. Применение оси descendant-or-self

<HTML xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="1.0">

 <HEAD>

  <TITLE>

   The Planets Table

  </TITLE>

 </HEAD>

 <BODY>

  <H1>

   The Planets Table

  </Н1>

  <TABLE BORDER="2">

   <TR>

    <TD>Name</TD>

    <TD>Mass</TD>

    <TD>Radius</TD>

    <TD>Day</TD>

   </TR>

   <xsl:for-each select="/descendant-or-self::node()/PLANET">

    <TR>

     <TD><xsl:value-of select="NAME"/></TD>

     <TD><xsl:value-of select="MASS"/></TD>

     <TD><xsl:value-of select="RADIUS"/></TD>

     <TD><xsl:value-of select="DAY"/></TD>

    </TR>

   </xsl:for-each>

  </TABLE>

 </BODY>

</HTML>

Вот и все. Я применил здесь упрощенную таблицу стилей, чтобы подчеркнуть, что при помощи таких осей потомков, как descendant или descendant-or-self, вы можете автоматически обрабатывать все выбираемые узлы, во многом аналогично тому, как это делают элементы <xsl:for-each> или <xsl:template>.

Применение оси following

Ось following (следующий) содержит все узлы, расположенные после контекстного узла в соответствии с установленным в документе порядком (другими словами, в порядке, в котором они появляются в документе, начиная с его начала), исключая всех потомков контекстного узла, а также исключая узлы атрибутов и пространств имен.

В этом примере (листинг 7.8) я выбираю каждый элемент <PLANET> и копирую все последующие элементы в результирующий документ.

Листинг 7.8. Применение оси following

<?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="PLANET">

  <xsl:for-each select="following::*">

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

  </xsl:for-each>

 </xsl:template>

</xsl:stylesheet>

Далее показан результат. Обратите внимание на то, что, когда этот шаблон выбирает элемент <PLANET> Меркурия, он копирует все последующие элементы — то есть Венеру, затем всех потомков Венеры, далее Землю и затем всех потомков Земли. После этого он выбирает элемент <PLANET> Венеры и копирует все следующие элементы, то есть Землю и всех потомков Земли:

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

<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>

<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>

<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><!--B перигелии-->

</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>

 <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><!--B перигелии-->

</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>

С другой стороны, при использовании оси following-sibling в результирующий документ будут скопированы только следующие братья, то есть только элементы <PLANET>, как мы увидим в следующем разделе.

Применение оси following-sibling

Ось following-sibling содержит всех последующих братьев контекстного узла.

Например, я могу выбрать каждый элемент <PLANET> и скопировать в результирующий документ все узлы в оси following-sibling следующим образом (листинг 7.9).

Листинг 7.9. Применение оси following-sibling

<?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="PLANET">

  <xsl:for-each select="following-sibling::*">

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

  <xsl:for-each>

 </xsl:template>

</xsl:stylesheet>

При этом сначала копируются два узла-брата, следующие за Меркурием (Венера и Земля), затем копируется следующий узел-брат Венеры, Земля. У самой Земли нет следующих за ней братьев, поэтому результат выглядит так:

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

<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>

<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><!--B перигелии-->

</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><!--B перигелии-->

</PLANET>

Применение оси namespace

Ось namespace содержит узлы пространств имен контекстного узла. Заметьте, что эта ось пуста, если контекстным узлом не является элемент. У элемента присутствует узел пространства имен для:

• каждого атрибута элемента, чье имя начинается с «xmlns:»;

• каждого атрибута элемента-предка, чье имя начинается с «xmlns:» (конечно, если сам элемент или ближайший предок не объявит пространство имен заново);

• атрибута xmlns, если элемент или предок имеет атрибут xmlns.

В следующем примере (листинг 7.10) я хочу отобразить пространство имен элемента <PLANET> в результирующем документе, и в исходном документе я присвоил пространству имен значение «http://www.starpowder.com».

Листинг 7.10. planets.xml с объявлением пространства имен

<?xml version="1.0"?>

<?xml-stylesheet type="text/xml" href="planets.xsl"?>

<PLANETS xmlns="http://www.starpowder.com">

 <PLANET>

  <NAME>Mercury</NAME>

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

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

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

1 ... 61 62 63 64 65 ... 115 ВПЕРЕД
Перейти на страницу:

Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Стивен Холзнер - XSLT, относящееся к жанру Интернет. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.

Комментарии (0)