.net – XSLT mod检查大数字
发布时间:2020-12-16 22:56:43 所属栏目:百科 来源:网络整理
导读:我正在尝试在XSLT 1.0中对17位数进行模数11检查.但是,似乎总是给出错误的输出. 我能找到的唯一信息是在this post,然而,没有找到解决方案. 我过去曾使用XSLT模板作为Luhn检查器,我意识到这与模数检查的工作方式不同,但我想知道是否有人知道可以计算大数模的XS
我正在尝试在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作为第二个参数传递. …. <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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |