Xml 如果XSLT中的值超过两位数,则舍入值

Xml 如果XSLT中的值超过两位数,则舍入值,xml,xslt,Xml,Xslt,如果XSLT中有两个以上的数字,我想对值进行舍入 输入 3.310 3.245 3.882 1.091 输出应为: <ans> <rt>6.5</rt </ans> 6.5四舍五入=3 (0.51-0.495)*100=1.5 我得到的错误是: 未为类型(xs:string,xs:integer)的参数定义算术运算符。 我正在使用XSLT 2.0,请检查以下代码: <xsl:template match="table/tr">

如果XSLT中有两个以上的数字,我想对值进行舍入

输入


3.310
3.245
3.882
1.091
输出应为:

<ans>
  <rt>6.5</rt
</ans>

6.5四舍五入=3

  • (0.51-0.495)*100=1.5

  • 我得到的错误是:

    未为类型(xs:string,xs:integer)的参数定义算术运算符。


    我正在使用XSLT 2.0,请检查以下代码:

    <xsl:template match="table/tr">
        <xsl:variable name="change" select="td[1]-td[2]"/>
        <xsl:variable name="xxx" select="number(format-number($change * 100,'0.0'))"/>
        <ans>
            <rt>
                <xsl:choose>
                    <xsl:when test="$change mod 1 eq 0">
                        <xsl:value-of select="round($xxx)"/>                      
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="round($xxx)"/>
                    </xsl:otherwise>
                </xsl:choose>
            </rt>
        </ans>
    </xsl:template>
    

    请检查以下代码:

    <xsl:template match="table/tr">
        <xsl:variable name="change" select="td[1]-td[2]"/>
        <xsl:variable name="xxx" select="number(format-number($change * 100,'0.0'))"/>
        <ans>
            <rt>
                <xsl:choose>
                    <xsl:when test="$change mod 1 eq 0">
                        <xsl:value-of select="round($xxx)"/>                      
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="round($xxx)"/>
                    </xsl:otherwise>
                </xsl:choose>
            </rt>
        </ans>
    </xsl:template>
    

    您遇到错误是因为您试图格式化一个已格式化的数字。格式化数字的结果是一个字符串

    我不明白你为什么要把数字格式化两次。此外,如果要对数字进行四舍五入,应使用
    round()
    函数。格式化一个数字不是一回事。比如说,

    round(0.5)
    
    返回1,但是

    format-number(0.5, '0')
    

    返回0。

    由于试图格式化已格式化的数字,因此出现错误。格式化数字的结果是一个字符串

    我不明白你为什么要把数字格式化两次。此外,如果要对数字进行四舍五入,应使用
    round()
    函数。格式化一个数字不是一回事。比如说,

    round(0.5)
    
    返回1,但是

    format-number(0.5, '0')
    
    返回0

    逻辑:

    如果有两位小数,则四舍五入为一位小数。例如:

    (3.310-3.245)*100=6.5

    (0.320-0.350)*100=2.95=>四舍五入=3

    (0.51-0.495)*100=1.5

    我正在使用XSLT2.0

    这里有一个正确的解决方案

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
      <xsl:template match="num/text()">
        <xsl:value-of select="my:round-two-digits(xs:decimal(.)), '&#xA;'"/>
      </xsl:template>
    
      <xsl:function name="my:round-two-digits" as="xs:decimal">
        <xsl:param name="pNum" as="xs:decimal"/>
    
        <xsl:sequence select=
          "if(floor($pNum * 10) eq ($pNum * 10))
             then $pNum
             else round($pNum)"/>
      </xsl:function>
    </xsl:stylesheet>
    
    <nums>
      <num>6.5</num>
      <num>2.95</num>
      <num>1.5</num>
    </nums>
    
    6.5 
    3 
    1.5 
    

    注意

    我个人更喜欢使用更紧凑的XPath表达式,因此可以将上述内容改写为:

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
      <xsl:template match="num/text()">
        <xsl:value-of select="my:round-two-digits(xs:decimal(.)), '&#xA;'"/>
      </xsl:template>
    
      <xsl:function name="my:round-two-digits" as="xs:decimal">
        <xsl:param name="pNum" as="xs:decimal"/>
    
        <xsl:sequence select=
          "($pNum[floor($pNum * 10) eq ($pNum * 10)],
            round($pNum))
                        [1]"/>
      </xsl:function>
    </xsl:stylesheet>
    
    
    
    逻辑:

    如果有两位小数,则四舍五入为一位小数。例如:

    (3.310-3.245)*100=6.5

    (0.320-0.350)*100=2.95=>四舍五入=3

    (0.51-0.495)*100=1.5

    我正在使用XSLT2.0

    这里有一个正确的解决方案

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
      <xsl:template match="num/text()">
        <xsl:value-of select="my:round-two-digits(xs:decimal(.)), '&#xA;'"/>
      </xsl:template>
    
      <xsl:function name="my:round-two-digits" as="xs:decimal">
        <xsl:param name="pNum" as="xs:decimal"/>
    
        <xsl:sequence select=
          "if(floor($pNum * 10) eq ($pNum * 10))
             then $pNum
             else round($pNum)"/>
      </xsl:function>
    </xsl:stylesheet>
    
    <nums>
      <num>6.5</num>
      <num>2.95</num>
      <num>1.5</num>
    </nums>
    
    6.5 
    3 
    1.5 
    

    注意

    我个人更喜欢使用更紧凑的XPath表达式,因此可以将上述内容改写为:

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
      <xsl:template match="num/text()">
        <xsl:value-of select="my:round-two-digits(xs:decimal(.)), '&#xA;'"/>
      </xsl:template>
    
      <xsl:function name="my:round-two-digits" as="xs:decimal">
        <xsl:param name="pNum" as="xs:decimal"/>
    
        <xsl:sequence select=
          "($pNum[floor($pNum * 10) eq ($pNum * 10)],
            round($pNum))
                        [1]"/>
      </xsl:function>
    </xsl:stylesheet>
    
    
    
    这个问题有些问题。你说:“(0.320-0.350)*100=2.95=>四舍五入=3”,但是(0.320-0.350)是-0.03,整个表达式的计算结果是-3,而不是2.95这个问题有问题。你说:“(0.320-0.350)*100=2.95=>四舍五入=3”,但是(0.320-0.350)是-0.03,整个表达式的计算结果是-3,而不是2.95