Как создать логическое значение?

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

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

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

Он всегда возвращает истину, когда должен быть ложью. Почему?

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

Will Dean 06.12.2008 15:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
86
1
91 571
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Просто к вашему сведению, согласно Документация MSDN, boolean () возвращает следующее:

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

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

Tomalak 06.12.2008 18:16

@Tomalak, посмотри мой ответ. Это немного более подробно и цитирует истинный источник: спецификацию W3C XPath, а не "MSDN".

Dimitre Novatchev 06.12.2008 20:35

@Dimitre: Я не думаю, что MSDN слишком сильно отклоняется от спецификации W3C в этом отношении. :) А вот указывать там конечно правильнее.

Tomalak 06.12.2008 20:57
Ответ принят как подходящий

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

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

является

   true()

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

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

   true() и false()

Подробности преобразования любого значения в логическое описаны в Спецификация XPath .:

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

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

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

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

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

В вашем случае строка «false» не является числом 0 и имеет положительную длину, поэтому применяется правило из третьего пункта выше, что дает 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()"/>

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

Jagger 15.05.2015 14:52

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

Dimitre Novatchev 15.05.2015 16:29

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

<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>

Надеюсь, это кому-то поможет

Другие вопросы по теме