XPath를 사용하여 노드 값이 숫자인지 어떻게 확인할 수 있습니까?
어떤 아이디어?
답변:
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>
Required item type of first operand of '=' is numeric; supplied value has item type xs:string;) 의 유형 불일치로 인해 XPath 2.0에서 완전히 실패 하지만 Dimitre의 솔루션은 잘 작동합니다.
변수에 포함 된 값을 $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입니다.
number($v) = number($v)다른 결과를 산출하는 경우에 대해 언급 할 수 있습니까 number($v) = $v?
number($v) = number($v)가 다른 결과를 산출하는 경우를 나열 할 수 number($v) = $v있습니까? 의심 할 여지없이 그것은 당신이 쓴 것에서 파생 될 수 있지만,이 질문을 어디에서 명시 적으로 언급했는지는 알 수 없습니다. 조밀하면 미안 해요. IOW, 귀하의 솔루션과 @ Oded 's / @ Alejandro의 솔루션이 항상 동일한 결과를 산출합니까?
나는 또 다른 대안을 제공하려는 것이 아니라이 문제에 대한 "메타 뷰"를 제공하려고합니다.
Oded와 Dimitre Novatchev가 이미 제공 한 답변은 정확하지만 사람들이 "값은 숫자입니다"라는 구절에서 실제로 의미 할 수있는 것은 내가 어떻게 말하겠습니까?
어떤면에서 "숫자 값을 어떻게 표현하고 싶습니까?"라는 기괴하게 들리는 질문에이 모든 것이 다가옵니다.
XPath 함수 number()는
여기에는 숫자 값에 대한 표현식이 포함되지 않습니다.
이것은 단순한 기준이 아닙니다. 스키마에 따라 유효한 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>
NaN에서 숫자 데이터 유형의 값은 어떤 숫자 값과도 같지 않고 비교를 위해 적어도 하나의 인수가 숫자 데이터 형식이면 다른 인수는 숫자로 캐스팅되므로 가장 짧은 숫자 테스트입니다.number(MyNode)=MyNode