xslt检查变量是否是十进制分隔符后面的数字的小数

时间:2016-11-17 08:43:18

标签: xslt integer decimal xslt-2.0

我希望以100.1之类的整数输入显示不同格式的十进制输入,如100.1,100.0 我使用以下检查来识别小数(变量输入是数字类型)

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

它适用于像100.1这样的情况,但它不适用于像100.00这样的情况,这会返回false表示这不是小数。 然后我尝试使用

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

这对于像100这样的整数不起作用,因为检查会返回true。 我试过了

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

我为100.50这样的值弄错了,不知道为什么。 还有其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您真的需要展示如何声明变量$input的类型(或者在没有类型声明的情况下,如何初始化其值)。它有很大的不同。

请注意,100.5作为XPath文字生成xs:decimal值100.5,但100.5保持为无类型属性节点的值将转换为xs:double值,大约等于100.5。

原则上,您可以使用

标识非整数的小数
$x instance of xs:decimal and not($x instance of xs:integer)

但是假设您首先将值创建为xs:decimalxs:integer;如果您执行xs:decimal("100"),那么您可能会[*]获得xs:decimal而不是xs:integer

[*]我可能会说,因为规范要求它是xs:decimal,但它可以说它是xs:decimal的子类型,例如:它甚至可以在此处返回xs:unsignedByte的实例,如果它选择了saxon:integer-in-range-1-to-100的实例,只要它被定义为xs:decimal的子类型。]

答案 1 :(得分:1)

如果要区分100和100.0,则不能位于数字域中。或许尝试:

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

或使用正则表达式。