부울 값을 만드는 방법은 무엇입니까?


86

나는 XSLT를 처음 접했고 다음 코드에서 내가 잘못 가고있는 곳을 찾을 수 없습니다.

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

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

거짓을 의미하는 경우 항상 참을 반환합니다. 왜?


3
제안 일 뿐이지 만 제목을 적절한 질문으로 작성하고 말하기를 피하면 더 나은 답변을 얻을 수 있습니다.
Will Dean

답변:


168

다음에 정의 된 $ var 변수의 값 :

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

이다

   true()

이는 XPath에서 " false"가 값 false()의 생성자 인과 반대로 일반 문자열 이기 때문입니다.booleanfalse()

XPath의 두 가지 부울 값은 다음과 같습니다 (구성되어 있음에 유의하십시오!).

   true()false()

모든 값을 부울로 변환하는 세부 사항은 XPath 사양에 설명되어 있습니다. :

" 부울 함수는 다음과 같이 인수를 부울로 변환합니다.

  • 숫자는 양수 또는 음수가 아니거나 NaN이 아닌 경우에만 참입니다.

  • 노드 세트는 비어 있지 않은 경우에만 true입니다.

  • 문자열은 길이가 0이 아닌 경우에만 true입니다.

  • 네 가지 기본 유형이 아닌 유형의 객체는 해당 유형에 종속 된 방식으로 부울로 변환됩니다. "

귀하의 경우 문자열 "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 안녕하세요 Dimitre. 부울 값이 XSL 변환 파일에 하드 코딩 된 경우 이것이 해결책입니다. 문자열 비교를 포함하지 않는 변환중인 파일에서 오는 falsetrue문자열에 대한 깔끔한 솔루션이 있습니까?
Jagger

1
@ 재거, 이것은 다른 질문입니다. 이 질문은 " How to create a Boolean value "에 대한 정확한 답을 얻었습니다. " 특정 문자열을 부울 값으로 해석 (또는 구문 분석)하는 방법 "이라는 질문은 완전히 다른 질문입니다. 문자열 비교에 어떤 문제가 있는지 물어봐도 될까요?
Dimitre Novatchev

17

사용중인 boolean () 함수는 실제로 작업을 수행하고 있습니다. 명시적인 참 및 거짓 값을 사용하려면 다음 함수를 사용해야합니다.

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

참고로 MSDN 문서에 따라 boolean ()은 다음을 반환합니다.

  • 인수가 음수 또는 양수이면 부울 값 true로 변환됩니다.
  • 인수가 0이거나 NaN 값이면 false로 변환됩니다.
  • 인수가 비어 있지 않은 노드 집합이면 true로 변환됩니다. 빈 노드 세트는 false로 변환됩니다.
  • 인수가 비어 있지 않은 문자열이면 true로 변환됩니다 . 빈 문자열은 false로 변환됩니다.
  • 인수가 네 가지 기본 유형이 아닌 유형의 객체 인 경우 해당 유형에 종속 된 방식으로 부울로 변환됩니다.

목록의 두 번째 항목은 중요한 항목이므로 더 눈에 띄도록 다시 형식을 지정해야합니다. "boolean ( '')"도 false를 생성합니다.
Tomalak

2
@Tomalak, 내 대답을 참조하십시오. 좀 더 자세하고 진정한 출처 인 "MSDN"이 아닌 W3C XPath 사양을 인용합니다.
Dimitre Novatchev

1
@Dimitre :이 점에서 MSDN이 W3C 사양에서 너무 많이 벗어났다고 생각하지 않습니다. :) 그러나 거기를 가리키는 것은 물론 더 정확합니다.
Tomalak

5

아마도이 단계에서 조금 늦었지만 부울을 다루는 imo는 노력할만한 가치가 없습니다. 다음은 DB에서 돌아 오는 부울 (필수)을 처리하는 방법입니다.

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

이것이 누군가에게 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.