Стивен Холзнер - XSLT
<xsl:template match="PLANET">
<TR>
<TD><xsl:apply-templates 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="NAME | MASS">
<xsl:if test="self::NAME">
<xsl:value-of select="."/>
</xsl:if>
<xsl:if test="self::MASS">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
<xsl:value-of select="@UNITS"/>
</xsl:if>
</xsl:template>
.
.
.
На этом мы завершаем рассмотрение новых осей XPath. Давайте перейдем к примерам.
Примеры путей расположения
Мы изучили достаточно теории путей расположения. Но, понятно, лучше всего осваивать этот материал на примерах, поэтому я привожу следующий список примеров путей расположения (сокращенные варианты рассматриваются после этого списка):
• child::PLANЕТ. Возвращает дочерние элементы <PLANЕТ> контекстного узла;
• child::text(). Возвращает все дочерние текстовые узлы контекстного узла;
• child::node(). Возвращает всех детей контекстного узла;
• attribute::UNIT. Возвращает атрибут UNIT контекстного узла;
• descendant::PLANET. Возвращает все элементы-потомки <PLANET> контекстного узла;
• ancestor::PLANET. Возвращает всех предков <PLANET> контекстного узла;
• ancestor-or-self::PLANET. Возвращает предков <PLANET> контекстного узла. Если контекстным узлом тоже является <PLANET>, возвращает также контекстный узел;
• descendant-or-self::PLANET. Возвращает элементы-потомки <PLANET> контекстного узла. Если контекстным узлом тоже является <PLANET>, возвращает также контекстный узел;
• self::PLANET. Возвращает контекстный узел, если им является элемент <PLANET>;
• child::PLANET/descendant::NAME. Возвращает элементы-потомки <NAME> дочерних элементов <PLANET> контекстного узла;
• child::*/child::PLANET. Возвращает всех внуков <PLANET> контекстного узла;
• /. Возвращает корневой узел;
• /descendant::PLANET. Возвращает все элементы <PLANET> в документе;
• /descendant::PLANET/child::NAME. Возвращает все элементы <NAME> с родителем <PLANET> в документе;
• child::PLANET[position()=3]. Возвращает третьего ребенка <PLANET> контекстного узла;
• child::PLANET[position()=last()]. Возвращает последнего ребенка <PLANET> контекстного узла;
• /descendant::PLANET[position() = 3]. Возвращает третий элемент <PLANET> в документе;
• child::PLANETS/child::PLANET[position()=4]/child::NAME[position()=3]. Возвращает третий элемент <NAME> четвертого элемента <PLANET> элемента <PLANETS>;
• child::PLANET[position()>3]. Возвращает всех детей <PLANET> контекстного узла после первых трех;
• preceding-sibling::NAME[position()=2]. Возвращает второй предыдущий элемент-брат <NAME> контекстного узла;
• child::*[self::NAME or self::MASS]. Возвращает детей <NAME> и <MASS> контекстного узла.
• child::*[self::NAME or self::MASS][position()=last()]. Возвращает последнего ребенка <NAME> или <MASS> контекстного узла.
Как видите, синтаксис некоторых выражений достаточно запутан, и набирать их также довольно долго. Но, как и для образцов, существует сокращенная форма синтаксиса XPath.
Сокращенный синтаксис XPath
Сокращения синтаксиса XPath могут быть весьма удобными. Ниже приведены правила:
• self::node() может быть сокращено как .;
• parent::node() может быть сокращено как ..;
• child::childname может быть сокращено как childname;
• attribute::childname может быть сокращено как @childname;
• /descendant-or-self::node()/ может быть сокращено как //.
Например, путь расположения .//PLANET — сокращение для self::node()/descendant-or-self::node()/child::PLANET. Можно также сократить выражение предиката [position()=3] как [3], [position()=last()] как [last()] и т.д. Работать с путями расположения XPath при помощи сокращенного синтаксиса значительно проще. В следующем списке перечислен ряд примеров путей расположения с использованием сокращенного синтаксиса:
• PLANET возвращает дочерние элементы <PLANET> контекстного узла;
• * возвращает все дочерние элементы контекстного узла;
• text() возвращает все дочерние текстовые узлы контекстного узла;
• @UNITS возвращает атрибут UNITS контекстного узла;
• @* возвращает все атрибуты контекстного узла;
• PLANET[3] возвращает третьего ребенка <PLANET> контекстного узла;
• PLANET[last()] возвращает последнего ребенка <PLANET> контекстного узла;
• */PLANET возвращает всех внуков <PLANET> контекстного узла;
• /PLANETS/PLANET[3]/NAME[2] возвращает второй элемент <NAME> третьего элемента <PLANET> элемента <PLANETS>;
• //PLANET возвращает всех потомков <PLANET> корня документа;
• PLANETS//PLANET возвращает элементы-потомки <PLANET> дочерних элементов <PLANETS> контекстного узла;
• //PLANET/NAME возвращает все элементы <NAME>, у которых есть родитель <PLANET>;
• . возвращает сам контекстный узел;
• .//PLANET возвращает элементы-потомки <PLANET> контекстного узла;
• .. возвращает родителя контекстного узла;
• ../@UNITS возвращает атрибут UNITS родителя контекстного узла;
• .//.. возвращает всех родителей потомка контекстного узла и родителя контекстного узла;
• PLANET[NAME] возвращает детей <PLANET> контекстного узла, у которых есть дети <NAME>;
• PLANET[NAME="Venus"] возвращает детей <PLANET> контекстного узла, у которых есть дети <NAME> с текстом, равным «Venus»;
• PLANET[@UNITS="days"] возвращает всех детей <PLANET> контекстного узла, у которых есть атрибут UNITS со значением «days»;
• PLANET[6][@UNITS="days"] возвращает шестого ребенка <PLANET> контекстного узла, только если у этого ребенка есть атрибут UNITS со значением «days». Можно также написать PLANET[@UNITS="days"][6];
• PLANET[@COLOR and @UNITS] возвращает всех детей <PLANET> контекстного узла, у которых есть атрибут COLOR и атрибут UNITS;
• "//PLANET[not(.=preceding::PLANET)]" выбирает все элементы <PLANET>, значение которых отлично от значения любого предшествующего элемента <PLANET>;
• *[1][self::NAME] выбирает любой элемент <NAME>, который является первым ребенком своего родителя;
• *[position() < 5][@UNITS] выбирает первых пятерых детей контекстного узла, у которых есть атрибут UNITS.
Проверка выражений XPath
В пакет Xalan входит удобная программа-пример, ApplyXPath.java, позволяющая применить выражение XPath к документу и посмотреть на результат, что очень помогает при тестировании. Для запуска этого примера вам нужно будет скомпилировать ApplyXPath.java в ApplyXPath.class при помощи утилиты java.exe, входящей в поставку Java.
В качестве примера я применю выражение XPath «PLANET/NAME» к planets.xml при помощи ApplyXPath.class. Ниже показан результат, отображающий все элементы <NAME>, дочерние по отношению к элементам <PLANET> (теги <output> добавлены программой ApplyXPath):
%java ApplyXPath planets.xml PLANET/NAME
<output>
<NAME>Mercury</NAME><NAME>Venus</NAME><NAME>Earth</NAME>
</output>
XPath 2.0
XPath находится в стадии обновления, и в него включаются средства поддержки XSLT 2.0 (см. www.w3.org/TR/xpath20req). Задачи XPath 2.0 следующие:
• упрощение операций с содержимым типов, поддерживаемых схемой XML;
• упрощение операций со строковым содержимым;
• поддержка соответствующих стандартов XML;
• улучшение удобства использования;
• улучшение функциональной совместимости;
• улучшение поддержки международных языковых средств;
• сохранение обратной совместимости;
• повышенная эффективность процессора.
Следующий список дает обзор требований XPath. Главные пункты — поддержка схемы XML и регулярных выражений, что дает средства работы со строками и поиска в строках. (Дополнительную информацию о регулярных выражениях можно почерпнуть по адресу http://www.perldoc.com/perl5.6/pod/perlre.html.) В соответствии с W3C, XPath 2.0:
• должен поддерживать архитектуру XML W3C, хорошо взаимодействуя с другими стандартами в семействе XML;
Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Стивен Холзнер - XSLT, относящееся к жанру Интернет. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.


