xslt выбор между select = "1" или select = "'1'" - PullRequest
2 голосов
/ 29 июня 2011

В чем разница между <xsl:variable name="test" select="1"/>

и <xsl:variable name="test" select="'1'"/>?

если оба результата являются результирующими фрагментами .. поэтому в основном две строки кода выше идентичны?

Если так. как мы решаем, что использовать?

Ответы [ 3 ]

2 голосов
/ 29 июня 2011

Как указал @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

из-за неявного преобразования, вызванного операторами сравнения.

2 голосов
/ 29 июня 2011

В первом примере создается переменная типа номер со значением числа 1, во втором - переменная типа строка со значением строки «1». Фрагменты дерева результатов не создаются с вашими примерами кода, что было бы сделано с <xsl:variable name="test">1</xsl:variable>.

1 голос
/ 29 июня 2011

XPath 1.0 и XSLT 1.0 рассматривают числа и строки как практически взаимозаменяемые, за очень немногими исключениями. Заметным исключением является item [$ test]. Но «=» также ведет себя немного по-разному: числа 4 и 04 равны, а строки - нет.

В XPath 2.0 и XSLT 2.0 система типов намного богаче, а разница между строками и числами гораздо более заметна: многие операции, определенные для чисел, не будут работать со строками, и наоборот.

Как решить? Если он полностью числовой, вы, как правило, хотите использовать число, если только это не что-то вроде номера телефона, где начальные нули значимы, и поэтому на самом деле это не число, а строка цифр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...