在 XSL 中测试 xs:decimal 的正确方法是什么?

2024-05-14

我试图根据传入的数据显示不同的信息。如果它是整数,我想只显示数字,如果它是小数,我想使用 0.00# 模式。是的,我知道,有点混乱,但这就是开发规范。 :>

对于这个特定部分,我有以下 XSL,但我无法看到 xsl:when 错误消息

“预期的表达式结束,发现 “可浇注”。数字(SAVG)-->可浇注料

<xsl:choose>
    <xsl:when test="number(SAVG) > 0">
        <xsl:choose>
            <xsl:when test="number(SAVG) castable as xs:decimal">
                <xsl:value-of select="format-number(SAVG, '###,###,##0.00#')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="format-number(SAVG, '###,###,##0.###')"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:when>
    <xsl:when test="number(SAVG) = 0">
        <xsl:text disable-output-escaping="yes">&amp;lt;</xsl:text>1
    </xsl:when>
    <xsl:otherwise>N/A</xsl:otherwise>
</xsl:choose>

我尝试寻找/探索答案,我尝试过“实例”,我尝试过使用 xsl:if 等,但我似乎无法让它工作。任何帮助将不胜感激。

Thanks.

来自评论:

是的,我们使用的是1.0。对不起我是 XSL 处理新手,我该如何 粘合 XSL 和输入以生成 html?


一、XSLT 1.0:

XSLT 1.0 使用的 XPath 1.0 数据模型中没有 xs:integer 和 xs:decimal。

这是您可以使用的代码片段:

    <xsl:choose> 
        <xsl:when test="not(floor(SAVG) = SAVG)"> 
            <xsl:value-of select="format-number(SAVG, '###,###,##0.00#')"/> 
        </xsl:when> 
        <xsl:otherwise> <!-- Integer value -->
            <xsl:value-of select="SAVG"/> 
        </xsl:otherwise> 
    </xsl:choose> 

Do note:要测试数值是否为整数,我们使用以下测试:

 floor($someNum) = $someNum

这是执行此操作的一种方法:

<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 $num in (3, 3.14)
     return
       if($num instance of xs:integer)
         then ($num, ' is xs:integer', '&#xA;')
         else if($num instance of xs:decimal)
           then ($num, ' is xs:decimal', '&#xA;')
           else ($num, ' is something else', '&#xA;')
   "/>
 </xsl:template>
</xsl:stylesheet>

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

3  is xs:integer 
3.14  is xs:decimal 

或者,使用format-number()按照你的例子运行:

<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 $num in (3, 3.14)
     return
       if($num instance of xs:integer)
         then (format-number($num, '###,###,##0.###'), '&#xA;')
         else if($num instance of xs:decimal)
           then (format-number($num, '###,###,##0.00#'), '&#xA;')
           else ()
   "/>
 </xsl:template>
</xsl:stylesheet>

produces:

3 
3.14 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 XSL 中测试 xs:decimal 的正确方法是什么? 的相关文章

随机推荐