Я не понимаю, выход из этой таблицы стилей:Действительно ли xsl: последовательность всегда не пуста?
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="root/sub"/>
</xsl:template>
<xsl:template match="sub">
<xsl:variable name="seq">
<xsl:sequence select="*" />
</xsl:variable>
<xsl:message>
<xsl:value-of select="@id" />
<xsl:text>: </xsl:text>
<xsl:value-of select="count($seq)" />
</xsl:message>
</xsl:template>
</xsl:stylesheet>
при применении к следующему XML:
<root>
<sub id="empty" />
<sub id="one"><one/></sub>
<sub id="two"><one/><one/></sub>
<sub id="three"><one/><one/><one/></sub>
</root>
выход, написанный xsl:message
элементом, является:
empty: 1
one: 1
two: 1
three: 1
я ожидал вместо этого:
empty: 0
one: 1
two: 2
three: 3
Почему count($seq)
всегда возвращает 1 в этом случае? Как бы вы изменили определение переменной, чтобы я мог позже проверить ее на пустоту? (Простой <xsl:variable name='seq' select='*' />
вернет ожидаемый ответ, но это не вариант ... Я хочу изменить переменную between
в this template и проверить ее на пустоту позже).
Большое спасибо! Для справки, вот ссылка на соответствующую часть документации (если я правильно понимаю): http://www.w3.org/TR/xslt20/#temporary-trees –
Да, вы понимаете это правильно. Эта часть спецификации показывает, что вы неявно имеете инструкцию 'xsl: document'. Он также указывает на то, о чем я не упоминал: вы можете использовать атрибут 'as', если вам нужен определенный тип вывода. Последовательность внутри 'xsl: variable' должна быть конвертируемой в этот тип или произошла ошибка. – Abel