2016-11-17 3 views
0

Я хочу показать десятичные входы как 100.1, 100.0 в другом формате от целочисленных входов, таких как 100 Я использовал следующую проверку для определения десятичных знаков (переменный ввод числового типа)xslt проверить, является ли переменная десятичной с цифрами после десятичного разделителя

<xsl:when test="not(floor($input) = $input)"> 

он работает в таких случаях, как 100,1, но она не работает в тех случаях, как 100,00, это будет возвращать ложь о том, что это не является десятичным. я тогда пытался использовать

<xsl:when test="$input castable as xs:decimal"> 

Это не будет работать для целых, как 100, как проверка будет возвращена истина. Я попытался

<xsl:when test="$input instance of xs:decimal"> 

, для которого я получаю ложные для значений как 100.50, не знаю, почему. Есть ли другой способ решить эту проблему?

+2

Я рассматриваю это как * искусственное * проблема - в математике 100.0 * является * целым числом. Вы хотите различить разные * лексические * представления для целочисленного значения по-другому - это может быть невозможно, потому что часто лексическое представление теряется задолго до того, как оценивается выражение XPath. Например, невозможно сказать, было ли число «5» первоначально введено как +5 или как 5. Точно так же строка (100.00) может содержать или не содержать точку - на самом деле с Saxon 9.x это doesn «т! Таким образом, к сожалению, ответ by @ michael.hor257k вызывает 'false()', когда вы хотите, чтобы это было 'true()' –

+1

На самом деле * все * 11 XSLT-процессоров, с которыми я работаю, оценивают 'string (100.00)' as '' 100 "' –

ответ

1

Если вы хотите различать от 100 до 100,0, вы не можете находиться в числовом домене. Попробуйте, пожалуйста:

<xsl:when test="contains($input, '.')"> 

или используйте регулярное выражение.

+1

Входной файл с числовым типом, это дает ошибку «Требуемый тип первого аргумента contains() - это xs: string; заданное значение имеет Тип xdt: числовой« – themanwhosoldtheworld

+0

Я не уверен, что «xdt: числовой' есть. Если вы используете процессор, ориентированный на схему, и вход определяется как один из числовых типов (например,xs: decimal), то я не думаю, что ваш процессор может рассказать разницу между 100 и 100.0. –

+1

переменная является результатом операции «sum», и я думаю, поэтому процессор обрабатывает ее как числовой тип. – themanwhosoldtheworld

2

Вам действительно нужно показать, как вы объявили тип переменной $input (или в отсутствие объявления типа, как вы инициализировали ее значение). Это имеет большое значение.

Обратите внимание, что 100.5 как литерал XPath генерирует xs: десятичное значение 100.5, но 100.5, сохраненное как значение нетипизированного узла атрибута, будет преобразовано в значение xs: double, приблизительно равное 100.5.

В принципе можно определить десятичные, которые не являются целыми числами, используя

$x instance of xs:decimal and not($x instance of xs:integer) 

, но это предполагает, что вы создали значение как xs:decimal или xs:integer в первую очередь; если вы делаете xs:decimal("100"), то вы, вероятно, [*] получите xs:decimal, который не является xs:integer.

[*] Я говорю, вероятно, потому что спецификация требует, чтобы она была xs: decimal, но она, возможно, позволяет ей быть подтипом xs: decimal, например. он мог бы даже возвратить экземпляр xs:unsignedByte здесь, если он выбрал или, если на то пошло, экземпляр saxon:integer-in-range-1-to-100, если это определено как подтип xs:decimal.]

+0

Хороший ответ. Другое соображение состоит в том, что 100 и 100,00 являются двумя разными * лексическими * представлениями того же значения. Таким образом, оценка 'string (100.00)' с Saxon 9.1J выдает строку «100» - представление, в котором исчезают десятичная точка и нули, следующие за ней. –

+0

Dr. Kay. В чем были причины для решения W3 WG, что экземпляр 10000 xs: decimal' является 'true()', но экземпляр 100.00 xs: integer' является 'false()'? –

+0

В группе W3C XQuery были жестокие дебаты задолго до того, как я присоединился к ней между сторонниками «названного набора» и «структурной типизацией». Именованная типизация выиграла, и я не могу попытаться обобщить аргументы. Именованное типирование в основном означает, что значения содержат аннотацию типа, которая должна быть явно выделена путем литья/валидации, тогда как структурная типизация означает, что вы можете вывести тип из содержимого. С атомными значениями это приводит к очевидной бессмыслице, как «3 экземпляр xs: positiveInteger», который является ложным, что я всегда считал сумасшедшим. –