当前位置 : 主页 > 网页制作 > xml >

.net – XSLT mod检查大数字

来源:互联网 收集:自由互联 发布时间:2021-06-13
我正在尝试在XSLT 1.0中对17位数进行模数11检查.但是,似乎总是给出错误的输出. 我能找到的唯一信息是在this post,然而,没有找到解决方案. 我过去曾使用XSLT模板作为Luhn检查器,我意识到这
我正在尝试在XSLT 1.0中对17位数进行模数11检查.但是,似乎总是给出错误的输出.

我能找到的唯一信息是在this post,然而,没有找到解决方案.

我过去曾使用XSLT模板作为Luhn检查器,我意识到这与模数检查的工作方式不同,但我想知道是否有人知道可以计算大数模的XSLT模板?

有一个纯XSLT 1.0解决方案,可以为任何大小的整数$n计算$n mod 11:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:call-template name="mod11"/>
 </xsl:template>

 <xsl:template name="mod11">
  <xsl:param name="pN" select="."/>

  <xsl:choose>
   <xsl:when test="not($pN > 9999999999999999)">
     <xsl:value-of select="$pN mod 11"/>
   </xsl:when>
   <xsl:otherwise>
      <xsl:variable name="vLen" select="string-length($pN)"/>

      <xsl:variable name="vLen1" select="$vLen -1"/>

      <xsl:variable name="vPart1" select=
          "substring($pN, 1, $vLen1)"/>

      <xsl:variable name="vPart2" select=
          "substring($pN, $vLen1 +1)"/>

      <xsl:variable name="vMod1">
       <xsl:call-template name="mod11">
         <xsl:with-param name="pN" select="$vPart1"/>
       </xsl:call-template>
      </xsl:variable>

      <xsl:variable name="vMod2" select="$vPart2 mod 11"/>

      <xsl:value-of select="(10*$vMod1 + $vMod2) mod 11"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档时:

<t>12345678901234567</t>

产生了想要的正确结果(12345678901234567 mod 11):

9

请注意:

>这个解决方案可以很容易地推广到任何整数$m的$n mod $m – 只需将$m作为第二个参数传递.
>另一个推广是将参数作为参数传递给上限,使用mod运算符无法直接计算$n mod $m.当使用XSLT 2.0并将$n作为xs:integer或xs:decimal时,这非常有用.
>另一种方法是使用Saxon.NET XSLT 2.0处理器或任何其他实现Big Integer算术的XSLT 2.0处理器.然后解决方案就是使用mod运算符:

….

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
     <xsl:value-of select="xs:integer(.) mod 11"/>
 </xsl:template>
</xsl:stylesheet>

当在同一XML文档(上面)中使用Saxon 9.1.07进行此转换时,会产生相同的正确结果:

9
网友评论