## Re: [xsl] XPath MOD 10 calculation

 Subject: Re: [xsl] XPath MOD 10 calculation From: Abel Braaksma Date: Fri, 25 May 2007 16:17:33 +0200
Andrew Welch wrote:
On 5/25/07, David Carlisle <davidc@xxxxxxxxx> wrote:
```>   <xsl:variable name="calc" select="(10 - ((sum(\$odd) * 3) +
> sum(\$even)) mod 10) mod 10" as="xs:integer"/>
>     <xsl:if test="\$calc ne \$check-digit">UPC not legal</xsl:if>```

```foo mod 10 mod 10  is the same as foo mod 10, and 10 mod 10 is 0 so the
above is```

<xsl:if test="(\$check-digit + ((sum(\$odd) * 3) + sum(\$even))) mod 10 =0">

Nice!

That give a boolean to check the UPC is correct - is it ok to re-write it as:

10 - ((sum(\$odd) * 3) + sum(\$even)) mod 10

```to give you the check-digit?  If so it makes the outermost "mod 10" of
\$calc redundant?  (if it is then step #4 on the wikipedia article isnt
needed)
```

It is needed for calculating the check digit, in the special case that the steps 1..3 produce 10 (which is, if the \$totalsums mod 10 equal 0). 10 is not allowed as digit. Doing modulo 10, will give 0.

```Example:
Suppose your 11-digit number is 12345678950
When you apply the algorithm sums it gives you 100
Step 3 is now: 10 - 100 mod 10 = 10 - 0 = 10
Step 4 (now necessary) gives: 10 mod 10 = 0
ergo: check digit is 0. The UPC-A string becomes 123456789500```

This special case works correctly with the tests posted here afaik. As it comes, the 12345678950 is a valid Luhn number. All others (not having a check digit of 0) are invalid Luhn numbers.

```Cheers,
-- Abel Braaksma```