Обновление:
Из-за технического сбоя с моей стороны я не смог понять, что это не сработает с версией XSL 1.0.Мы с Майклом отметили, что ваш XPath неверен.Мой пример ниже работает только с XSL версии 2.0 или новее, поэтому используйте код Майкла для версии 1.0.
Ключевая проблема заключается в выражениях XPath для работы с вашей переменной.
Когда выобъявите вашу переменную следующим образом:
<xsl:variable name="items">
<xsl:apply-templates select="//item" />
</xsl:variable>
... вы получите переменную в памяти $items
, которая имеет это:
<item>4</item>
<item>5</item>
<item>6</item>
Когда я запускаю ваш код,место, где вы просто выталкиваете значение с помощью xsl:value-of
, я просто получаю поведение по умолчанию, где XSL выплевывает строковое значение содержимого:
<?xml version="1.0" encoding="UTF-8"?><root xmlns:exsl="http://exslt.org/common">
items count: 1
item output: 456</root>
Так как я получаю немного другой вывод, я должен спросить- какой процессор XSL вы используете?
Кроме того, эта переменная, в частности, не набор узлов, а скорее фрагмент документа .Поэтому, если вы хотите получить доступ к какому-либо конкретному элементу <item>
в этой переменной, вам нужно рассматривать имя переменной как корень.Так что если у вас есть count($items)
, вы просто получите счет 1, поскольку есть только один корневой элемент.
Для подсчета <item>
элементов в пределах $items
вам необходимоукажите правильный XPath: count($items/item)
.
Кроме того, чтобы вывести строковое значение переменной, вам не нужно менять его на набор узлов.
Попробуйте это для своего корневого шаблона:
<xsl:template match="/">
<root>
<xsl:variable name="items">
<xsl:apply-templates select="//item" />
</xsl:variable>
items count: <xsl:value-of select="count($items/item)"/>
item output: <xsl:value-of select="$items"/>
</root>
</xsl:template>
Мой вывод:
<?xml version="1.0" encoding="UTF-8"?><root xmlns:exsl="http://exslt.org/common">
items count: 3
item output: 456</root>