Jak mogę sprawdzić, czy wartość węzła jest liczbą przy użyciu XPath?
Jakieś pomysły?
Jak mogę sprawdzić, czy wartość węzła jest liczbą przy użyciu XPath?
Jakieś pomysły?
Odpowiedzi:
Przetestuj wartość względem NaN :
<xsl:if test="string(number(myNode)) != 'NaN'">
<!-- myNode is a number -->
</xsl:if>
To jest krótsza wersja (dzięki @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;), rozwiązanie Dimitre działa jednak dobrze.
Najkrótszym możliwym sposobem sprawdzenia, czy wartość zawarta w zmiennej $vmoże być użyta jako liczba, to :
number($v) = number($v)
Wystarczy zastąpić $vpowyższe wyrażenie, którego wartość chcesz przetestować.
Wyjaśnienie :
number($v) = number($v)jest oczywiście prawdą, jeśli $vjest liczbą lub łańcuchem reprezentującym liczbę.
Dotyczy to również wartości logicznej, ponieważ a number(true())wynosi 1 i number(false)wynosi 0.
Ilekroć $vnie można użyć jako liczby, number($v)oznacza to NaN
a NaN nie jest równe żadnej innej wartości, nawet sobie.
Zatem powyższe wyrażenie jest prawdziwe tylko dla $vktórego wartość może być użyta jako liczba, a fałsz w przeciwnym razie.
number($v) = number($v)daje inny wynik number($v) = $v?
number($v) = number($v)daje inny wynik number($v) = $v? Bez wątpienia można to wyprowadzić z tego, co napisałeś, ale nie widzę, gdzie bezpośrednio odniosłeś się do tego pytania. Przepraszam, jeśli jestem gęsty. IOW, czy Twoje rozwiązanie i rozwiązanie @ Oded / @ Alejandro zawsze dają takie same wyniki?
Nie próbuję przedstawić innego alternatywnego rozwiązania, ale „meta spojrzenie” na ten problem.
Odpowiedzi udzielone już przez Odeda i Dimitre Novatcheva są poprawne, ale to, co ludzie naprawdę mogliby mieć na myśli, mówiąc „wartość to liczba”, jest, jak bym to powiedział, otwarte na interpretację.
W pewnym sensie wszystko sprowadza się do tego dziwnie brzmiącego pytania: „jak chcesz wyrazić swoje wartości liczbowe?”
Funkcja XPath number()przetwarza liczby, które mają
Zauważ, że nie obejmuje to wyrażeń dla wartości liczbowych that
To nie są tylko wymyślone kryteria. Element, którego treść jest zgodna ze schematem, ma prawidłową xs:floatwartość, może zawierać dowolną z wyżej wymienionych cech. Jednak number()zwróci wartość NaN.
Zatem odpowiedz na pytanie „Jak mogę sprawdzić za pomocą XPath, czy wartość węzła to liczba?” to „Użyj już wspomnianych rozwiązań używając number()” lub „z pojedynczym wyrażeniem XPath 1.0, nie możesz”. Pomyśl o możliwych formatach liczb, które możesz napotkać, i jeśli to konieczne, napisz jakąś logikę do walidacji / analizowania liczb. W ramach przetwarzania XSLT można to zrobić na przykład za pomocą kilku odpowiednich dodatkowych szablonów.
PS. Jeśli zależy Ci tylko na liczbach niezerowych, najkrótszy test to
<xsl:if test="number(myNode)">
<!-- myNode is a non-zero number -->
</xsl:if>
NaNwartość typu danych liczba nie jest równa żadnej wartości liczbowej i dla porównania, jeśli co najmniej jeden argument to liczba wpisana, drugi jest rzutowany na liczbę, jest to test najkrótszej liczby:number(MyNode)=MyNode