【问题标题】:XSLT Number testXSLT 编号测试
【发布时间】:2010-10-11 21:31:29
【问题描述】:

我遇到了一个问题,$current 变量的值是“6E144270003”。我最初的目标是只测试一个数字,但“6E144270003”通过了 number() 测试,因为它是一个有效的“科学符号”(正如我在这里指出的那样)。

我需要一个有效的测试以允许仅包含整数(可以包括小数和减号)的数据等同于真,而任何其他数据等同于假。

应该通过:1234567890
应该通过:123.45
应该通过:123.5
应该通过:-123.45

 <xsl:if test="number($current) = number($current)">  
    <xsl:value-of select="$current"/>   
 </xsl:if>  

【问题讨论】:

  • @joncar:请学习提问的道德规范。永远不要更改您的问题以使接受和赞成的答案看起来不正确!更好的是,提出一个新问题。
  • @joncar:您的示例是小数,而不是“问题中所说的仅包含整数的数据”。

标签: xml xslt xslt-2.0 xpath-2.0


【解决方案1】:

我遇到了值的问题 的 $current 变量作为 '6E144270003',它在 Saxon 2.0 处理器错误为 '转换失败,无效的词法值 - xs:double'。

我无法重现这个问题。

这种转变

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:variable name="current" select="'6E144270003'"/>
    <xsl:template match="/">
    <xsl:if test="number($current) = number($current)">
    <xsl:value-of select="$current"/>
 </xsl:if>

    </xsl:template>
</xsl:stylesheet>

使用 SAXON 9.0.0.4 运行时,会产生

6E144270003

我不确定为什么会发生这种情况 不是数字以及如何 纠正它。基本上如果不是 number 我不想输出它

字符串"6E144270003"可以在 XPath 2.0 中用作数字,因为在 XPath 2.0 中所谓的*科学记数法`是表示号码。

这是一个有趣的例子,其中 XSLT 1.0 和 XSLT 2.0 的行为不同。

更新:OP 表示他想要一个测试,如果字符串包含除数字以外的任何内容,则该测试将评估为 false()

这可以通过正则表达式来最好地实现,甚至:

translate($s, '0123456789', '') eq ''

UPDATE2:OP又改了问题!!!

对于最新的问题,这里是答案:

使用

$s castable as xs:decimal

这个转换证明了这个方法的正确性:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output method="text"/>

    <xsl:template match="/">
     <xsl:sequence select=
      "for $s in ('1234567890',
                 '123.45',
                 '123.5',
                '-123.45',
                 '6E144270003'
                 )
       return
         if($s castable as xs:decimal)
           then $s
           else ()

      "/>
    </xsl:template>
</xsl:stylesheet>

当此转换应用于任何 XML 文档(未使用)时,会产生正确的结果

1234567890 123.45 123.5 -123.45

【讨论】:

  • @Dimitre:+1 快速回答。这对我来说也是一样的。我认为应该指出这不是 XSLT 2.0 中正确的数据类型测试。 OP 应该使用“castable”运算符。
  • @Alejandro: castable 用于测试某些item() 是否属于某种类型。如果 OP 只是对值 是否可以表示并用作数字感兴趣,那么 number($x) = number($x) 仍然是一个很好的测试。
  • 在这种情况下,数据将永远不会被表示为“科学记数法”。在这种情况下,我需要 IF 条件由于“E”而失败。
  • @jonkar:这甚至是一个有效的整数!所以,请更新您的问题并说您要测试字符串的所有字符都是数字!
  • @jonkar:我更新了我的答案,给你一个你可能想要的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 2011-12-14
  • 1970-01-01
  • 2017-10-04
  • 2021-10-12
  • 1970-01-01
相关资源
最近更新 更多