Як створити логічне значення?


86

Я абсолютно новачок у XSLT і не можу зрозуміти, де я помиляюся з наступним кодом.

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

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

Він завжди повертає істину, коли він призначений як помилковий. Чому?


3
Просто пропозиція, але ви можете отримати кращий рівень відповіді, якщо напишете заголовок як правильне запитання і уникаєте виступу l33t.
Уілл Дін

Відповіді:


168

Значення змінної $ var, як визначено у:

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

є

   true()

Це тому, що в XPath " false" є звичайним рядком, на відміну від false(), який є конструктором booleanзначенняfalse()

Два логічні значення в XPath є (зверніть увагу, що вони побудовані!):

   true() і false()

Деталі перетворення будь-якого значення в логічне значення прописані в специфікації XPath .:

" Логічна функція перетворює свій аргумент у логічну форму таким чином:

  • число є істинним тоді і лише тоді, коли воно не є ні позитивним, ні негативним нулем, ні NaN

  • набір вузлів є істинним тоді і лише тоді, коли він не є порожнім

  • рядок є істинним тоді і лише тоді, коли його довжина не дорівнює нулю

  • об'єкт типу, відмінного від чотирьох базових типів, перетворюється на логічний тип способом, який залежить від цього типу "

У вашому випадку рядок "помилковий" не є числом 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()"/>


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

1
@Jagger, Це вже для іншого питання. Це питання задає питання " Як створити булеве значення " і отримало точну відповідь. Ви запитуєте: " Як інтерпретувати (або проаналізувати) окремі рядки на логічні значення " - це вже зовсім інше питання. Чи можу я запитати, що не так із порівнянням рядків?
Dimitre Novatchev

17

Функція boolean (), яку ви використовуєте, справді робить свою роботу. Для використання явних істинних та хибних значень слід використовувати такі функції:

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

Просто FYI, згідно з документацією MSDN , boolean () повертає таке:

  • Якщо аргумент є від’ємним чи додатним числом, він перетворюється на логічне значення true.
  • Якщо аргумент дорівнює нулю або значенню NaN, він перетворюється на false.
  • Якщо аргумент є непустим набором вузлів, він перетворюється на true. Порожній набір вузлів перетворюється на false.
  • Якщо аргумент є непустим рядком, він перетворюється на true . Порожній рядок перетворюється на false.
  • Якщо аргумент є об'єктом типу, відмінного від чотирьох основних типів, він перетворюється на логічний тип способом, який залежить від цього типу.

Вам слід переформатувати передостанній пункт вашого списку, щоб виділятися більше, оскільки він є вирішальним. "boolean ('')" також створить false.
Томалак

2
@Tomalak, див. Мою відповідь. Він дещо детальніший і цитує справжнє джерело: W3C XPath Spec, а не "MSDN".
Dimitre Novatchev

1
@Dimitre: Я не думаю, що MSDN надто сильно відхиляється від специфікації W3C у цьому плані. :) Але вказувати там , звичайно, правильніше.
Томалак

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>

Сподіваюся, це комусь допомагає

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.