노드 값이 숫자인지 XPath 테스트


89

XPath를 사용하여 노드 값이 숫자인지 어떻게 확인할 수 있습니까?

어떤 아이디어?

답변:


124

NaN 에 대해 값을 테스트합니다 .

<xsl:if test="string(number(myNode)) != 'NaN'">
    <!-- myNode is a number -->
</xsl:if>

이것은 더 짧은 버전입니다 ( @Alejandro 감사 합니다 ) :

<xsl:if test="number(myNode) = myNode">
    <!-- myNode is a number -->
</xsl:if>

10
XPath 1.0 NaN에서 숫자 데이터 유형의 값은 어떤 숫자 값과도 같지 않고 비교를 위해 적어도 하나의 인수가 숫자 데이터 형식이면 다른 인수는 숫자로 캐스팅되므로 가장 짧은 숫자 테스트입니다.number(MyNode)=MyNode

10
@Alejandro의 짧은 버전은 = 연산자 ( Required item type of first operand of '=' is numeric; supplied value has item type xs:string;) 의 유형 불일치로 인해 XPath 2.0에서 완전히 실패 하지만 Dimitre의 솔루션은 잘 작동합니다.
Lucero

61

변수에 포함 된 값을 $v숫자로 사용할 수 있는지 테스트하는 가장 짧은 방법 은 다음과 같습니다.

number($v) = number($v)

당신은 $v위의 값을 테스트하려는 표현식으로 됩니다.

설명 :

number($v) = number($v)$v숫자이거나 숫자를 나타내는 문자열 이면 분명히 사실 입니다.

a number(true())는 1이고 number(false)0 이기 때문에 부울 값에 대해서도 마찬가지 입니다.

때마다 $v숫자로 사용할 수 없습니다, 다음 number($v)NaN이있다

NaN은 그 자체로도 다른 값과 동일하지 않습니다.

따라서 위의 식은 $v값을 숫자로 사용할 수있는 경우에만 true 이고 그렇지 않으면 false입니다.


1
+1 유용한 설명. 누군가 number($v) = number($v)다른 결과를 산출하는 경우에 대해 언급 할 수 있습니까 number($v) = $v?
LarsH 2010 년

@LarsH : 나는 이미 이러한 경우에 대해 언급했습니다. 아직 논의되지 않은 사례를 지적 할 수 있습니까?
Dimitre Novatchev

누군가 number($v) = number($v)가 다른 결과를 산출하는 경우를 나열 할 수 number($v) = $v있습니까? 의심 할 여지없이 그것은 당신이 쓴 것에서 파생 될 수 있지만,이 질문을 어디에서 명시 적으로 언급했는지는 알 수 없습니다. 조밀하면 미안 해요. IOW, 귀하의 솔루션과 @ Oded 's / @ Alejandro의 솔루션이 항상 동일한 결과를 산출합니까?
LarsH 2010 년

@LarsH : 분명히 사용하고 싶지 않은 것이기 때문에 Oded의 솔루션을 보지 않았습니다. 나는 Al2jandro의 솔루션과 내 솔루션이 $ v의 모든 값에 대해 동일한 답을 제공한다고 생각합니다.
Dimitre Novatchev

1
@EricS, IEEE 표준을 구매해야만 액세스 할 수있는 것 같습니다 ... Byt는 여기를보십시오 : cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF . 특히이 단락 : "IEEE 754는 NaN을 포함하는 모든 관계식에 값을 할당합니다. C 구문에서 조건 자 x! = y는 True이지만 다른 모든 경우 x <y, x <= y, x == y, x> = y 및 x> y는 x 또는 y 또는 둘 다 NaN 일 때마다 False입니다. "
Dimitre Novatchev

18

XPath 2.0에는 사용할 수있는 놀라운 유형 테스트 연산자가 있습니다.

<xsl:if test="$number castable as xs:double">
    <!-- implementation -->
</xsl:if>

15

나는 또 다른 대안을 제공하려는 것이 아니라이 문제에 대한 "메타 뷰"를 제공하려고합니다.

Oded와 Dimitre Novatchev가 이미 제공 한 답변은 정확하지만 사람들이 "값은 숫자입니다"라는 구절에서 실제로 의미 할 수있는 것은 내가 어떻게 말하겠습니까?

어떤면에서 "숫자 값을 어떻게 표현하고 싶습니까?"라는 기괴하게 들리는 질문에이 모든 것이 다가옵니다.

XPath 함수 number()

  • 가능한 선행 또는 후행 공백
  • 음수 값에서만 선행 기호 문자
  • 소수점 구분 기호로서의 (정수의 경우 선택 사항)
  • [0-9] 범위의 다른 모든 문자

여기에는 숫자 값에 대한 표현식이 포함되지 않습니다.

  • 지수 형식으로 표시됩니다 (예 : 12.3E45).
  • 양수 값에 대한 부호 문자를 포함 할 수 있습니다.
  • 양수와 음수 0을 구분합니다
  • 양수 또는 음수 무한대 값 포함

이것은 단순한 기준이 아닙니다. 스키마에 따라 유효한 xs:float값인 컨텐츠가있는 요소 는 위에서 언급 한 특성을 포함 할 수 있습니다. 그러나 number()value를 반환합니다 NaN.

따라서 "노드 값이 숫자 인 경우 XPath로 어떻게 확인할 수 있습니까?"라는 질문에 답하십시오. "이미 언급 된 솔루션을 사용하여 number()"또는 "단일 XPath 1.0 표현식으로 사용할 수 없습니다"입니다. 발생할 수있는 가능한 숫자 형식에 대해 생각하고 필요한 경우 유효성 검사 / 숫자 구문 분석을위한 일종의 논리를 작성합니다. 예를 들어 XSLT 처리 내에서 적절한 추가 템플릿을 거의 사용하지 않고도이 작업을 수행 할 수 있습니다.

추신. 0이 아닌 숫자에만 관심이 있다면 가장 짧은 테스트는

<xsl:if test="number(myNode)">
    <!-- myNode is a non-zero number -->
</xsl:if>

1
+1 질문의이면에있는 문제에 대한 자세한 설명 : OP가 무엇을 의미하는지 또는 그가 무엇을 물어봐야하는지 안다면 의미했을 수 있습니다.
LarsH 2010 년

9

내가 매우 유용하다고 생각한 것은 다음과 같습니다.

<xsl:choose>
  <xsl:when test="not(number(myNode))">
      <!-- myNode is a not a number or empty(NaN) or zero -->      
  </xsl:when>
  <xsl:otherwise>
      <!-- myNode is a number (!= zero) -->        
  </xsl:otherwise>
</xsl:choose>

2

항상 다음과 같이 사용할 수 있습니다.

string(//Sesscode) castable as xs:decimal

castable은 W3C에 의해 여기에 문서화되어 있습니다 .


1

저는 숫자 인 01을 다루었습니다.

string(number($v)) != string($v) 분리를 만든다

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