XPath
Здесь стоит остановиться и вспомнить, что XML документ имеет древовидную структуру. В документе имеется всегда один и только один корневой элемент, тэг <?xml version="1.0" ?> к дереву отношения не имеет (для XSL-T Xalan перед этим тегом не должно стоять ни каких пробелов).
У элементов (или тэгов) дерева существуют потомки (или родители) и предки (или дети), у корневого элемента предков нет.
Элементы дерева могут имет уровни вложености (далее уровни). У элементов на одном уровне быают предидущие и следующие элементы, соответственно у первого элемента нет предидущего у последнего нет следующего.
<root>
|
- корневой элемент
|
<node1>
|
- предок - root, следующий на уровне node2 имеет потомка node11
|
<node11/>
|
- имеет предка node1
|
</node1>
|
|
<node2/>
|
- предидущий элемент node1, следующий node3, предок - root
|
<node3/>
|
|
</root>
|
|
Оси
-->Пример<--
ancestor::
|
Возвращает множество предков.
|
ancestor-or-self::
|
Возвращает множество предков и текущий элемент.
|
attribute::
|
Возвращает множество атрибутов текущего элемента.
|
child::
|
Возвращает множество потомков на один уровень ниже.
|
descendant::
|
Возвращает полное множество потомков.
|
descendant-or-self::
|
Возвращает полное множество потомков и текущий элемент.
|
following::
|
Возвращает необработтанное множество, ниже текущего элемента.
|
following-sibling::
|
Возвращает множество элементов на том же уровне, следующих за текущим.
|
namespace::
|
Возвращает множество имеющее пространство имён (т.е. присутствует аттрибут xmlns).
|
parent::
|
Возвращает предка на один уровень назад.
|
preceding::
|
Возвращает множество обработанных элементов исключая множество предков.
|
preceding-sibling::
|
Возвращает множество элементов на том же уровне, предшествующих текущему.
|
self::
|
Возвращает текущий элемент.
|
|
Операции с путями
*
|
- возвращает множество из всех элементов
|
@name
|
- возвращает множество атрибутов элемента когда name="*", лиБо возвращает значение указанного атрибута.
|
$name
|
- возвращает значение параметра
|
[]
|
- определяет дополнительное условие для выборки множества.
|
{}
|
- говорит XSL-T процессору, что то, что написанно в фигурных скобках должно рассматриваться как XPath, а не как сторка.
|
/
|
- определяет уровень дерева
|
//
|
- говорит о том, что возможно любое вложение уровней дерева
|
Логические операторы
or - условие "или"
and - условие "и"
= - условие "равно"
!= - условие "не равно"
< - условие "меньше"
> - условие "больше"
<= - условие "меньше либо равно"
>= - условие "больше либо равно"
Математические операторы
+ - сложение
- - вычитание
* - умножение
/ - деление
div - целочисленное деление
mod - остаток от деления
Функции XSL
Function: string
text()
Возвращает текстовое содержимое элемента.
Function: node-set
node()
Возвращает элемент.
Function: node-set
document(object, node-set?)
Возвращает документ указанный в параметре object.
Function: node-set
key(string, object)
Возвращает множество с указанным ключом, аналогично функции id для идентификаторов.
Function: string
format-number(number, string, string?)
Форматирует число согласно образцу указанному во втором параметре, третий параметр указывает именованный формат числа, который должен быть учтён.
Function: node-set
current()
Возвращает множество из одного элемента, который является текущим.
Обычно
<xsl:value-of select="current()"/> равносильно укороченной записи
<xsl:value-of select="."/>, но не при применении внутри выражений-фильтров.
Например, выражение
<xsl:apply-templates select="//glossary/item[@name=current()/@ref]"/>
выбирает все элементы glossary/item, имеющие значение атрибута name равное значению атрибута ref текущего элемента.
В отличии от выражения
<xsl:apply-templates select="//glossary/item[@name=./@ref]"/>,
которое означает то же, что и
<xsl:apply-templates select="//glossary/item[@name=@ref]"/>
и выбирает все элементы glossary/item, у которых значение атрибута name совпадает со значением атрибута ref.
Function: string
unparsed-entity-uri(string)
Возвращает непроанализированный URI, если такового нет, возвращает пустую строку.
Function: string
generate-id(node-set?)
Возвращает строку, являющуюся уникальным идентификатором.
Function: object
system-property(string)
Возвращает системные переменные параметр может быть:
- xsl:version - возвращает версию XSL-T процессора.
- xsl:vendor - возвращает производителя XSL-T процессора.
- xsl:vendor-url - возвращает URL идентифицирующий производителя.
Если используется неизвестный параметр, функция возвращает пустую строку.
Function: boolean
element-available(string)
Проверяет доступен ли элемент или множество указанное в параметре. Параметр рассматривается как XPath.
Function: boolean
function-available(string)
Проверяет доступна ли функция указанная в параметре. Параметр рассматривается как XPath.
Функции с множествами
Function: number
last()
Возвращает номер последнего элемента в множестве
Function: number
position()
Возвращает позицию элемента в множестве
Function: number
count(node-set)
Возвращает количество элементов в node-set
Function: node-set
id(object)
Находит элемент с уникальным идентификатором
Function: string
local-name(node-set?)
Возвращает имя первого тэга в множестве, без пространства имён.
Function: string
namespace-uri(node-set?)
Возвращает ссылку на url определяющий пространство имён.
Function: string
name(node-set?)
Возвращает полное имя первого тэга в множестве.
вход
|
<root
xmlns:xdoc ="www.company.com/xdoc"
xmlns:xsmp ="www.company.com/sample"
>
<xsmp:sample >
<a />
<b />
</xsmp:sample >
<xdoc:document >
<chapter >a</chapter >
<chapter >b</chapter >
<chapter >c</chapter >
<chapter >d</chapter >
<chapter >e</chapter >
</xdoc:document >
</root >
|
<xsl:template match ="root">
<xsl:value-of select ="local-name(*)"/>
<xsl:value-of select ="name(*)"/>
<xsl:value-of select ="namespace-uri(*)"/>
<xsl:value-of select ="namespace-uri(*[2])"/>
<xsl:value-of select ="count(xdoc:document/*)"/>
</xsl:template >
<xsl:template match ="xdoc:document">
<xsl:for-each select ="chapter">
<xsl:value-of select ="."/>
<xsl:if test ="not(position()=last())">
<xsl:text >, </xsl:text >
</xsl:if >
</xsl:for-each >
</xsl:template >
|
выход
|
sample
xsmp:sample
www.company.com/sample
www.company.com/xdoc
5
a, b, c, d, e
|
|
Строковые функции
Function: string
string(object?)
Конвертирует объект в строку, для
- NaN будет возврощено "NaN"
- Бесконечности будет возврощено "Infinity"
- Минус бесконечности будет возврощено "-Infinity"
- Для логики будет возвращено "true" или "false"
Например:
string(123.4567) вернёт "123.4567"
string(1 div 0) вернёт "Infinity"
string(true()) вернёт "true"
<somenode>some text</somenode>
string(somenode) вернёт "some text".
Function: string
concat(string, string, string*)
Объеденяет две или более строк.
Например:
concat("First", "Second", "Third") вернёт "FirstSecondThird".
Function: boolean
starts-with(string, string)
Возвращает истину если вторая строка входит в начало первой, иначе возвращает ложь.
Например:
starts-with("abcdefgh", "abc") вернёт true
starts-with("qwe", "qwerty") вернёт false.
Function: boolean
contains(string, string)
Возвращает истину, если первая строка содержит вторую, иначе возвращает ложь.
Например:
contains("abcde", "") вернёт true
contains("abcde", "cde") вернёт true
contains("abcde", "123") вернёт false.
Function: string
substring-before(string, string)
Если найдена вторая строка в первой, возвращает строку до первого вхождения второй строки.
Например:
substring-before("2000/08/21","/") вернёт 2000.
Function: string
substring-after(string, string)
Если найдена вторая строка в первой, возвращает строку после первого вхождения второй строки.
Например:
substring-after("2000/08/21","/") вернёт 08/21.
Function: string
substring(string, number, number?)
Возвращает строку вырезанную из строки начиная с указанного номера, и если указан второй номер - количество символов.
Например:
substring("123456",3,3) вернёт "345"
substring("123456", 3) вернёт "3456".
Function: number
string-length(string?)
Возвращает длину строки.
Например:
string-length("some text") вернёт 9.
Function: string
normalize-space(string?)
Убирает лишние и повторные пробелы, а так же управляющие символы, заменяя их пробелами.
Например:
$str = "some
text "
normalize-space($str) вернёт "some text ".
Function: string
translate(string, string, string)
Переводит символы первой строки которые встречаются во второй строке, на соответствующие символам второй строки символы из третьей строки. Примеры:
Например:
translate("bar","abc","ABC") вернет BAr
translate("-aaa--","abc-","ABC") вернет AAA.
Логические функции
Function: boolean
boolean(object)
Приводит объект к логическому типу. Вернётся истина для:
- числа, если оно не ноль и не NaN
- множества, если оно не пустое
- строки, если она не нулевой длины
- для любых не базовых типов зависит от типа.
Function: boolean
not(boolean)
Отрицание, возвращает истину если аргумент ложь и наоборот.
Function: boolean
true()
Возвращает истину.
Function: boolean
false()
Возвращает ложь.
Function: boolean
lang(string)
Возвращает истину если у текущего тэга имеется атрибут xml:lang, либо родитель тэга имеет атрибут xml:lang и в нем указан совпадающий строке символ. Следующие тэги для вызова lang("ru") вернут истину:
<para xml:lang="ru"/>
<div xml:lang="ru"><para/></div>
<para xml:lang="RU"/>
<para xml:lang="ru-RU"/>
Функции с числами
Function: number
number(object?)
Переводит объект в число, для
- логики - истина переведётся в 1, ложь в 0
- строки - число, если конвертировать невозможно то в NaN
- для множества, будет взят первый тэг, его имя преобразовано в строку и, потом в число.
- Для других типов - в зависимости от типа.
Function: number
sum(node-set)
Вернёт сумму множества, каждый тэг множества будет преобразован в строку и из него получено число.
Например:
<items>
<item>10</item>
<item>23</item>
<item>7</item>
</items>
sum(items/item) вернёт 40,
<items>
<item>abc</item>
<item>23</item>
<item>7</item>
</items>
sum(items/item) вернёт NaN.
Function: number
floor(number)
Возвращает наибольшее целое число, не большее, чем аргумент.
Например:
floor(-0.8) вернёт -1
floor(3.6) вернёт 3.
Function: number
ceiling(number)
Возвращает наименьшее целое число, не меньшее, чем аргумент.
Например:
ceiling(-3.8) вернёт -3
ceiling (8.6) вернёт 9.
Function: number
round(number)
Округляет число.
Например:
round(-3.8) вернёт -4
round(8.2) вернёт 8
round(-3.5) вернёт -3
round(8.5) вернёт 9.