mod 操作在 XSLT1.0 中的工作方式不同

问题描述 投票:0回答:2

我需要在XSLT1.0中进行求模运算。但是,它没有返回在 Java 中运行良好的预期结果。

XSLT1.0:

输入:

<xsl:variable name="num2" select="'501108006111600075131466'"/>
<xsl:variable name="num3" select="'3214282912345698765432161182'"/>

<xsl:value-of select="$num2 mod 97"/>
<xsl:value-of select="$num3 mod 97"/>

输出:

82
65

Java

输入

StringBuilder numeric = new StringBuilder();
numeric.append(501108006111600075131466);//Input1
//numeric.append(3214282912345698765432161182);//Input2
BigInteger nt = new BigInteger(numeric.toString());
return nt.mod(BigInteger.valueOf(97)).intValue() == 1;

输出

true
true

在Java中,返回预期结果,但在XSLT1.0中它不返回准确的输出。在XSLT1.0中还有其他方法实现mod运算符吗?

xml xslt xslt-1.0
2个回答
1
投票

问题是 XSLT 1.0 代码中的数字表达式将使用 XPath 1.0 numbers,它们只是 双精度浮点数,精度不足以表示示例中的大数字。您的号码的最低有效位将会丢失。


0
投票

考虑使用数字类型,而不是字符串,但对于很大的数字,您可能需要切换到 XSLT/XPath 2 或 3,其中您有

xs:integer
xs:decimal
类型,例如

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  expand-text="yes">
  
  <xsl:variable name="num1" as="xs:integer" select="501108006111600075131466"/>
  <xsl:variable name="num2" as="xs:integer" select="3214282912345698765432161182"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template name="xsl:initial-template">
    <tests>
      <test expression="{$num1} mod 97">{$num1 mod 97}</test>
      <test expression="{$num2} mod 97">{$num1 mod 97}</test>
    </tests>
  </xsl:template>

</xsl:stylesheet>

给予

<tests>
   <test expression="501108006111600075131466 mod 97">1</test>
   <test expression="3214282912345698765432161182 mod 97">1</test>
</tests>
© www.soinside.com 2019 - 2024. All rights reserved.