Позвольте мне ответить на вопрос «почему» на ваш вопрос.
Если вы напишите следующее утверждение:
<xsl:variable name="x" select="*" />
переменная $x
содержит последовательность дочерних узлов текущего узла. В $x
нет неявного родительского узла, потому что вы используете select
. Теперь рассмотрим следующее:
<xsl:variable name="x">
<content />
<content />
</xsl:variable>
где переменная $x
содержит последовательность одного узла: родительский узел content
. Здесь count($x)
всегда даст вам 1
. Чтобы получить количество элементов content
, необходимо подсчитать дочерние элементы неявного корневого узла $x
: count($x/content)
.
Как правило, вы можете помнить, что: , если xsl:variable
сам является пустым элементом с атрибутом select
, результирующий набор будет присвоен переменной. Если вы используете xsl:variable
без атрибута select
, вы всегда создаете неявного родителя с переменной, а содержимое переменной - это дочерние элементы под ним .
То же самое относится к вашему примеру с xsl:sequence
как ребенок к xsl:variable
. Имея непустой xsl:variable
, вы создаете неявного родителя для последовательности, поэтому вы всегда получаете 1
, если подсчитываете саму переменную.
Если вам нужны оба: набор операторов внутри xsl:variable
, но поведение атрибута select
, вы можете обойти это, используя следующее:
<xsl:variable name="x" select="$y/*" />
<xsl:variable name="y">
<xsl:sequence select="foo" />
</xsl:variable>
, который теперь даст ожидаемую сумму для count($x)
, но можно ли утверждать, что это действительно выгодно или делает ваш код более понятным.