2008-12-06 11 views
79

Я совершенно не знаком с XSLT и не могу решить, где я ошибаюсь в следующем коде.Как создать логическое значение?

<xsl:variable name="var" select="boolean('false')"/> 

<xsl:if test="$var'">variable is true</xsl:if> 

Это всегда возвращается к истине, когда оно должно быть ложным. Зачем?

+2

только предложению, но вы можете также получить лучший калибр ответа, если вы пишете свой титул правильный вопрос и избегать разговоров. –

+0

Спасибо, ребята, извините. – sydlawrence

ответ

160

Значение переменной $ вар, как определено в:

      <xsl:variable name="var" select="boolean('false')"/>

является

      true()

Это becaus е в XPath «false» является обычной строкой, в отличие от false(), который является конструктором для значения booleanfalse()

Два булевы значения в XPath являются (обратите внимание, что они построены!):

      true() и false()

деталь удобст rting любое значение до boolean, пишется в XPath Spec.:

«boolean функция преобразует свой аргумент в булево значение следующим образом:

  • число истинно, если и только если оно не является ни положительным или отрицательным нулевым , ни NaN

  • набор узлов является истинным тогда и только тогда, когда он не является пустым

  • строка истинна тогда и только тогда, когда ее длина ненулевая

  • объект типа, кроме четырех основных типов преобразуется в логическое значение таким образом, зависит от того типа "

В вашем случае строки «false» - это не число 0 и имеет положительную длину, поэтому применяется правило в 3-й марке, дающее true().

Поэтому, чтобы определить переменную в XSLT 1.0, значение которогоfalse(), нужно написать определение, как:

      <xsl:variable name="vMyVar" select="false()"/>

или, если вы этого не сделаете точно помните, вы всегда можете написать:

      <xsl:variable name="vMyVar" select="1 = 0"/>

(укажите любое выражение, которое принимает значение false()), и процессор XSLT выполнит эту работу за вас.

В XSLT 2.0 всегда лучше явно указать тип переменной:

      <xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>

+0

@DimitreNovatchev Hi Dimitre. Это решение, если булевское значение жестко закодировано в файле преобразования XSL.Есть ли четкое решение для строк 'false' и' true', исходящих из файла, находящегося под преобразованием, который не включает сравнение строк? – Jagger

+1

@Jagger, Это для другого вопроса. Этот вопрос задает «* Как создать логическое значение *» и получил его точный ответ. Вы спрашиваете: «* Как интерпретировать (или анализировать) определенные строки в булевы значения *» - это совершенно другой вопрос. Могу ли я спросить, что не так со сравнением строк? –

16

Функция boolean(), которую вы используете, действительно выполняет свою работу. Для использования явных истинные и ложные ценности, вы должны использовать следующие функции:

<xsl:variable name="var_false" select="false()"/> 
<xsl:variable name="var_true" select="true()"/> 

Просто FYI, согласно MSDN documentation, логическое() возвращает следующее:

  • Если аргумент является отрицательным или положительным числом , он преобразуется в значение Boolean true.
  • Если аргумент равен нулю или значение NaN, оно преобразуется в значение false.
  • Если аргумент является непустым набором узлов, он преобразуется в значение true. Пустой набор узлов преобразуется в значение false.
  • Если аргумент является непустой строкой, он преобразуется в значение true. Пустая строка преобразуется в значение false.
  • Если аргумент является объектом типа, отличного от четырех основных типов, он преобразуется в логическое значение таким образом, который зависит от этого типа.
+0

Вы должны переформатировать предпоследний элемент своего списка, чтобы больше выделяться, так как он является ключевым. msgstr "boolean ('')" также приведет к ложному срабатыванию. – Tomalak

+2

@ Томалак, см. Мой ответ. Это немного более подробно и цитирует истинный источник: W3C XPath Spec, а не «MSDN». –

+1

@ Dimitre: Я не думаю, что MSDN слишком сильно отклоняется от спецификации W3C. :) Но указание * там *, конечно, более корректно. – Tomalak

5

Немного поздно на этом этапе, возможно, но имо дело с булевы просто не стоит усилие. Вот как я имел дело с булевым (обязательно) возвращающейся из БДА:

<xsl:variable name="vTrue" select="true()"/>      
    <xsl:choose> 
     <xsl:when test="string(Mandatory) = string($vTrue)"> 
     <xsl:text>Mandatory</xsl:text> 
     </xsl:when> 
     <xsl:otherwise>   
     </xsl:otherwise> 
    </xsl:choose> 

Надеется, что это помогает кто-то