Як я можу перевірити, чи є значення вузла числом за допомогою XPath?
Будь-які ідеї?
Як я можу перевірити, чи є значення вузла числом за допомогою 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;
), проте рішення 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
значення, яке може використовуватися як число, а в іншому випадку - false.
number($v) = number($v)
результати приводяться інакше number($v) = $v
?
number($v) = number($v)
результат дається не так number($v) = $v
? Безсумнівно, це випливає з того, що ви написали, але я не бачу, де ви явно зверталися до цього питання. Вибачте, якщо я густий. IOW, чи завжди ваше рішення та рішення @ Oded / @ Alejandro дають однакові результати?
Я не намагаюся надати ще одне альтернативне рішення, а "метапогляд" на цю проблему.
Відповіді, вже надані Одедом та Димитром Новатчевим, є вірними, але те, що люди дійсно можуть мати на увазі під фразою "значення - це число", як би я сказав, відкрите для інтерпретації.
Певним чином все приходить до цього химерного звучачого запитання: "як ви хочете висловити свої числові значення?"
Функція XPath number()
обробляє числа, які мають
Зауважте, що сюди не входять вирази для числових значень, які
Це не просто вигадані критерії. Елемент із вмістом, який згідно зі схемою є допустимим xs:float
значенням, може містити будь-яку з вищезазначених характеристик. І все-таки number()
поверне значення NaN
.
Тож відповідь на ваше запитання "Як я можу перевірити за допомогою XPath, чи є значення вузла числом?" або "Використовуйте вже згадані рішення, використовуючи number()
", або "з одним виразом XPath 1.0, ви не можете". Подумайте про можливі формати чисел, з якими ви можете зіткнутися, і, якщо потрібно, напишіть якусь логіку для перевірки / аналізу чисел. Наприклад, під час обробки XSLT це можна зробити за допомогою декількох підходящих додаткових шаблонів.
PS. Якщо ви дбаєте лише про ненульові числа, найкоротший тест
<xsl:if test="number(myNode)">
<!-- myNode is a non-zero number -->
</xsl:if>
NaN
значення типу числового числа не дорівнює будь-якому числовому значенню, і для порівняння, якщо принаймні одним аргументом є числові дані, тоді інший відтворюється на число, це найкоротший тест числа:number(MyNode)=MyNode