$A
, либо в $B
, либо и там, и там.
В XSLT нет встроенного оператора, который позволил бы установить принадлежность узла некоторому множеству. Для этой цели используется очень хитроумный прием, основанный на использовании функции count
, которая возвращает количество узлов множества. Представим, что множество $node
содержит некоторый узел, и мы хотим проверить, входит ли он во множество $nodeset
. Сделать это можно при помощи выражения
count($nodeset) = count($node | $nodeset)
которое будет истинным тогда и только тогда, когда $node
полностью принадлежит $nodeset
.
Этот метод позволяет реализовать в XSLT другие операции над множествами — пересечение, разность и симметрическую разность. Подробное описание этих операций приводится в
В XSLT также нет оператора, который позволил бы проверить тождественность двух узлов. Например, если каждое из множеств $A
и $B
содержит по одному узлу, при помощи простого оператора равенства ($A = $B
) мы не сможем проверить, один и тот же это узел или два разных узла с одинаковыми текстовыми значениями.
Для того чтобы корректно выполнить такое сравнение, можно использовать функцию generate-id
, которая для каждого из узлов дерева генерирует уникальный строковый идентификатор, присущий только этому узлу и никакому другому, причем для одних и тех же узлов идентификаторы всегда будут генерироваться одинаковыми. Таким образом, для проверки тождественности двух узлов, содержащихся во множествах $A
и $B
, будет достаточно сравнить их уникальные идентификаторы:
generate-id($А) = generate-id($В)
Множества узлов могут быть преобразованы в булевые значения, числа и строки.
При преобразовании в булевый тип пустое множество узлов преобразуется в false
, а непустое — в true
. Например, чтобы проверить, есть ли у текущего узла атрибут value
, можно написать:
<xsl:if test='@value'>
<xsl:text>Value attribute exists here.</xsl:text>
</xsl:if>
Выражение @value
возвратит непустое множество, состоящее из узла атрибута value
, если он есть в текущем элементе, или пустое множество, если такого атрибута нет. В первом случае логическим эквивалентом будет true
, во втором — false
, то есть текст будет выведен только в случае наличия атрибута value
.
При преобразовании множества узлов в строку, результатом будет строковое значение первого в порядке просмотра узла множества.
<catalog>
<item>A</item>
<item>B</item>
<item>C</item>
<item>D</item>
</catalog>
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='text'/>
<xsl:template match='/'>
<xsl:value-of select='catalog/item'/>
</xsl:template>
</xsl:stylesheet>
Результат:
A
При преобразовании множества узлов в число, множество сначала приводится к строке, а затем строка преобразуется в численное значение. Проще говоря, численным значением множества узлов будет численное значение первого узла в порядке просмотра документа.
<numbers>
<integer>1</integer>
<real>1.5</real>
<integer>2</integer>
<real>2.6</real>
<integer>3</integer>
<real>3.7</real>
</numbers>
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='text'/>
<xsl:template match='/'>
<xsl:value-of select='numbers/real — numbers/integer'/>
</xsl:template>
</xsl:stylesheet>
Результат:
0.5
Результирующий фрагмент дерева (result tree fragment)
Четыре типа данных, описанных выше, заимствованы языком XSLT из XPath. Вместе с тем, XSLT имеет и свой собственный тип данных, называемый result tree fragment (результирующий фрагмент дерева).
Для того чтобы понять этот тип данных, обратимся к примеру шаблона:
<xsl:template match='href'>
<B>You may visit the <A HREF='{location}'>following link</A>.</B>
</xsl:template>
Если мы применим это правило к части документа