Наборы узлов XPath
Наборы узлов XPath
Как следует из имени, набор узлов (node set) является просто совокупностью узлов. Набор узлов может включать несколько узлов, единственный узел или быть пустым. Поскольку главная задача XPath — определять место разделов документов, постольку возвращающие наборы узлов выражения XPath являются наиболее популярными типами выражений. Например, выражение XPath child::PLANET возвращает набор узлов из всех элементов <PLANET>, дочерних для контекстного узла. Выражение child::PLANET/child::NAME возвращает набор узлов из всех элементов <NAME>, дочерних для элементов <PLANET> контекстного узла. Выражения XPath такого рода называются путями расположения, location path (W3C называет их «самой важной конструкцией» в XPath), и существенная часть этой главы будет посвящена разъяснению путей расположения.
Чтобы выбрать узел или узлы из набора узлов или обработать их, вы можете воспользоваться следующими функциями XPath для работы с наборами узлов, которые впервые встретились нам в главе 4 (и которые мы более подробно рассмотрим в следующей главе):
• count(node-set). Эта функция возвращает количество узлов в наборе. Если опустить параметр «набор узлов», функция будет применена к контекстному узлу;
• id(string ID). Эта функция возвращает набор узлов из элемента, чей ID удовлетворяет строке, переданной функции в качестве параметра, или пустой набор узлов, если ни у какого элемента нет указанного ID. Можно указать несколько идентификаторов, разделенных символами-разделителями, — в таком случае функция вернет набор узлов из элементов с этими идентификаторами;
• last(). Возвращает номер последнего узла в наборе;
• local-name(node-set). Возвращает локальное имя первого узла в наборе. Если опустить параметр «набор узлов», функция будет применена к контекстному узлу;
• name(node-set). Возвращает полностью определенное имя первого узла в наборе. Если опустить параметр «набор узлов», функция будет применена к контекстному узлу;
• namespace-uri(node-set). Возвращает URI пространства имен первого узла в наборе. Если опустить параметр «набор узлов», функция будет применена к контекстному узлу;
• position(). Возвращает позицию контекстного узла в контекстном наборе узлов (начиная с 1).
В следующем примере (из главы 6) для подсчета количества узлов в наборе применяется функция count. В этом случае набор узлов состоит из всех элементов <PLANET> в planets.xml, и я получил его при помощи пути расположения «\PLANET» (который как путь расположения также является выражением XPath):
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="PLANET">
<xsl:copy use-attribute-sets="numbering">
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:attribute-set name="numbering">
<xsl:attribute name="number"><xsl:number/></xsl:attribute>
<xsl:attribute name="total">
<xsl:value-of select="count(//PLANET)"/>
</xsl:attribute>
</xsl:attribute-set>
</xsl:stylesheet>
Ниже показан результат; заметьте, что у каждого элемента <PLANET> есть оба атрибута, number и total, и атрибут total содержит общее число элементов <PLANET> в документе:
<?xml version="1.0" encoding="UTF-8"?>
<PLANETS>
<PLANET number="1" total="3">
<NAME>Mercury</NAME>
<MASS>.0553</MASS>
<DAY>58.65</DAY>
<RADIUS>1516</RADIUS>
<DENSITY>.983</DENSITY>
<DISTANCE>43.4</DISTANCE>
</PLANET>
<PLANET number="2" total="3">
<NAME>Venus</NAME>
<MASS>.815</MASS>
<DAY>116.75</DAY>
<RADIUS>3716</RADIUS>
<DENSITY>.943</DENSITY>
<DISTANCE>66.8</DISTANCE>
</PLANET>
<PLANET number="3" total="3">
<NAME>Earth</NAME>
<MASS>1</MASS>
<DAY>1</DAY>
<RADIUS>2107</RADIUS>
<DENSITY>1</DENSITY>
<DISTANCE>128.4</DISTANCE>
</PLANET>
</PLANETS>
Среди функций для работы с наборами узлов в особенности обратите внимание на функции name и local-name. С их помощью можно определить имя текущего элемента: например, если текущим элементом является <DAY>, local-name вернет DAY. Следующая таблица стилей демонстрирует, для чего это может понадобиться; в ней я использую такие теги, как <PLANETS>, <PLANET> и <DATA>, в качестве элементов буквального результата:
<?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="PLANETS">
<PLANETS>
<xsl:for-each select="PLANET">
<PLANET>
<xsl:for-each select="*">
<DATA>
<xsl:value-of select="."/>
</DATA>
</xsl:for-each>
</PLANET>
</xsl:for-each>
</PLANETS>
</xsl:template>
</xsl:stylesheet>
Однако в таком случае разметка трактуется как простой текст. Вместо этого можно создать новые элементы при помощи <xsl:element>, определяя имена контекстных узлов через local-name:
<?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="PLANETS">
<xsl:element name="{local-name(.)}">
<xsl:for-each select="PLANET">
<xsl:element name="{local-name(.)}">
<xsl:for-each select="*">
<xsl:element name="DATA">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Ряд пишущих об XSLT авторов рассматривает выражения XSLT только как выражения, возвращающие наборы узлов. Но выражения XPath возвращают также логические значения, числа и строки, которые используются в элементах <xsl:param>, <xsl:with-param>, <xsl:number>, <xsl:value-of>, <xsl:sort>, шаблонах значений атрибутов и предикатах путей расположения. В предыдущем примере для вставки в документ числа я присвоил атрибуту select элемента <xsl:value-of> выражение XPath count(//PLANET), которое возвращает не набор узлов, а число. Сейчас мы как раз перейдем к обработке чисел при помощи выражений XPath.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Предикаты: наборы узлов
Предикаты: наборы узлов Набор узлов (node set), как понятно из названия, представляет собой просто совокупность узлов (и может содержать только один узел). Выражение child::PLANET возвращает набор узлов, состоящий из всех элементов <PLANET>. Выражение child::PLANET/child::NAME возвращает список
Числа XPath
Числа XPath В XPath числа хранятся в формате чисел с плавающей точкой двойной точности. В соответствии с формальным определением, числа XPath должны храниться в формате 64-разрядных чисел с плавающей точкой двойной точности IEEE 754, и все числа хранятся как числа с плавающей точкой
Шаги расположения XPath, часть 2: условия узлов
Шаги расположения XPath, часть 2: условия узлов При создании образцов в качестве условий узлов (node test) можно использовать имена узлов или символ подстановки * для выбора любого узла элемента. Например, выражение child::*/child::NAME выбирает все элементы <NAME>, являющиеся правнуками
Проверка выражений XPath
Проверка выражений XPath В пакет Xalan входит удобная программа-пример, ApplyXPath.java, позволяющая применить выражение XPath к документу и посмотреть на результат, что очень помогает при тестировании. Для запуска этого примера вам нужно будет скомпилировать ApplyXPath.java в ApplyXPath.class при
XPath 2.0
XPath 2.0 XPath находится в стадии обновления, и в него включаются средства поддержки XSLT 2.0 (см. www.w3.org/TR/xpath20req). Задачи XPath 2.0 следующие:• упрощение операций с содержимым типов, поддерживаемых схемой XML;• упрощение операций со строковым содержимым;• поддержка соответствующих
Функции XPath для работы с наборами узлов
Функции XPath для работы с наборами узлов Следующие функции XPath работают с наборами узлов:• count(node-set). Возвращает число узлов в наборе узлов;• id(string ID). Возвращает набор узлов элемента, ID которого совпадает с переданной функции строкой, или пустой набор узлов, если таковых
Логические функции XPath
Логические функции XPath XPath также поддерживает следующий набор логических функций:• boolean(). Приводит аргумент к логическому значению;• false(). Возвращает false (ложь);• lang(). Проверяет, совпадает ли язык, установленный в атрибуте xml:lang, с языком, переданным в функцию;• not().
Глава 6. XPath-выражения
Глава 6. XPath-выражения Шестая глава посвящена языку XPath, который используется в XSLT для выборок и вычислений на ХМL-документах. В этой главе рассматривается синтаксис и семантика XPath-выражений и паттернов XSLT и детально описываются функции базовой библиотеки
Изменения в XPath 2.0
Изменения в XPath 2.0 Разрабатываемая версия языка XPath, вследствие интеграции с XQuery, очевидно, претерпит серьезные изменения. Новая спецификация уже сейчас разбита на два документа: документ, описывающий модель данных и документ, описывающий функции и операторы. Поэтому на