Как указал @Martin, первый связывает переменную с числом, а второй со строкой.
как мы решаем, какой использовать?
Подумайте, как вы будете использовать эту переменную . Например, в первом случае вы сможете сделать:
item[$test]
Это будет невозможно во втором случае , если вы не используете функцию number()
.
Согласно комментариям ниже, строка или число не будут иметь никакого значения при использовании любого из операторов сравнения. Даже при сравнении с наборами узлов или RTF. Вы можете прочитать это в спецификации (немного многословно) или попробовать какой-нибудь глупый тест.
Что еще очевидно, так это различное поведение, которое вы можете получить при работе с позициями узлов. Например, если у вас есть:
<xsl:variable name="number2" select="2"/>
<xsl:variable name="string2" select="'2'"/>
<xsl:variable name="rtf2">2</xsl:variable>
и у вас есть такой ввод:
<root>
<test>a</test>
<test>b</test>
</root>
Используя:
<xsl:value-of select="/root/test[$rtf2]"/>
<xsl:value-of select="/root/test[$string2]"/>
<xsl:value-of select="/root/test[$number2]"/>
Вы получите:
aab
пока это:
<xsl:value-of select="/root/test[position()=$rtf2]"/>
<xsl:value-of select="/root/test[position()=$string2]"/>
<xsl:value-of select="/root/test[$number2]"/>
вернет:
bbb
из-за неявного преобразования, вызванного операторами сравнения.