代码之家  ›  专栏  ›  技术社区  ›  PHenry

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

  •  6
  • PHenry  · 技术社区  · 16 年前

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

    对于这个特定的部分,我有下面的XSL,但是我看不到要跳过xsl:when错误的消息

    “应为表达式结尾,但找到 &--十进制:xs“

    <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处理新手,如何 html?

    2 回复  |  直到 16 年前
        1
  •  6
  •   Dimitre Novatchev    16 年前

    一、 XSLT 1.0

    XSLT1.0使用的XPath1.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> 
    

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

     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>
    

    :

    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>
    

    生产

    3 
    3.14 
    
        2
  •  0
  •   user357812 user357812    16 年前

    此XSLT 1.0样式表:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="test">
            <xsl:choose>
                <!-- Not number or number less than zero -->
                <xsl:when test="0 > SVGA or number(SVGA) != SVGA">
                    <xsl:text>N/A</xsl:text>
                </xsl:when>
                <!-- Number zero -->
                <xsl:when test="SVGA = 0">
                    <xsl:text>&lt;1</xsl:text>
                </xsl:when>
                <!-- Integer number -->
                <xsl:when test="floor(SVGA) = SVGA">
                    <xsl:value-of select="format-number(SVGA,'###,###,##0.###')"/>
                </xsl:when>
                <!-- Double number -->
                <xsl:otherwise>
                    <xsl:value-of select="format-number(SVGA,'###,###,##0.00#')"/>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:text>&#xA;</xsl:text>
        </xsl:template>
    </xsl:stylesheet>
    

    有了这个输入:

    <root>
        <test>
            <SVGA>0</SVGA>
        </test>
        <test>
            <SVGA>12131</SVGA>
        </test>
        <test>
            <SVGA>123.5654</SVGA>
        </test>
        <test>
            <SVGA>-12.1</SVGA>
        </test>
        <test>
            <SVGA>-7528</SVGA>
        </test>
        <test>
            <SVGA>zero</SVGA>
        </test>
    </root>
    

    输出:

    &lt;1
    12,131
    123.565
    N/A
    N/A
    N/A
    

    编辑3