3 Stimmen

IBAN mit XSLT 2.0 validieren?

Ist es möglich, eine XSLT-Funktion zu schreiben, die die grundlegende IBAN Mod-97-Prüfung durchführen kann?

Aus Wikipedia:
1. Verschieben Sie die vier Anfangszeichen an das Ende der Zeichenkette.
2. Ersetzen Sie jeden Buchstaben in der Zeichenkette durch zwei Ziffern und erweitern Sie so die Zeichenkette, wobei A=10, B=11, ..., Z=35.
3. Interpretiere die Zeichenkette als ganze Dezimalzahl und berechne den Rest dieser Zahl bei der Division durch 97.

Wenn der Rest 1 ist, ist der Prüfzifferntest bestanden und die IBAN kann gültig sein.

Danke.

4voto

Dimitre Novatchev Punkte 234995

Diese Umwandlung :

<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 omit-xml-declaration="yes" indent="yes"/>
    <xsl:variable name="vCaps" select=
     "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>

 <xsl:template match="text()">
  <xsl:sequence select="my:isIBAN(.)"/>
 </xsl:template>

 <xsl:function name="my:isIBAN" as="xs:boolean">
  <xsl:param name="pString" as="xs:string"/>

  <xsl:variable name="vDigits" select=
   "string-join(
                (for $vStarting4 in substring($pString, 1,4),
                     $vRest in substring($pString, 5),
                     $vNewString in concat($vRest,$vStarting4),
                     $vLen in string-length($vNewString),
                     $i in 1 to $vLen
                   return
                     my:code(substring($vNewString,$i,1))
                 ),
                 ''
                 )
   "/>

   <xsl:sequence select="xs:integer($vDigits) mod 97 eq 1"/>
 </xsl:function>

 <xsl:function name="my:code" as="xs:string">
  <xsl:param name="pChar" as="xs:string"/>

  <xsl:sequence select=
  "if(string-length($pChar) ne 1 or not(contains($vCaps, $pChar)))
     then $pChar
     else
      xs:string
         (string-to-codepoints($pChar) - string-to-codepoints('A') +10)
  "/>
 </xsl:function>
</xsl:stylesheet>

bei Anwendung auf dieses XML-Dokument :

<t>GB82WEST12345698765432</t>

das gewünschte, korrekte Ergebnis liefert :

true

Bitte beachten : Die Funktion my:isIBAN() kann als ein einziger XPath 2.0-Ausdruck implementiert werden. Ich habe es aus Gründen der Lesbarkeit nicht angegeben.

2voto

Nur zum Spaß (ich habe nicht gesehen, dass @Dimitre schon geantwortet hat)

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:local="http://localhost/">
    <xsl:template match="IBAN[local:validate(.)]">
        <xsl:text>Validated IBAN</xsl:text>
    </xsl:template>
    <xsl:function name="local:validate">
        <xsl:param name="pIBAN" as="xs:string"/>
        <xsl:sequence select="xs:integer(
                                 codepoints-to-string(
                                    for $n in string-to-codepoints(
                                                 concat(
                                                    substring(
                                                       $pIBAN,
                                                       5
                                                    ),
                                                    substring(
                                                       $pIBAN,
                                                       1,
                                                       4
                                                    )
                                                 )
                                              )
                                    return if ($n > 64)
                                           then string-to-codepoints(
                                                   string(
                                                      $n - 55
                                                   )
                                                )
                                           else $n
                                 )
                              ) mod 97 eq 1"/>
    </xsl:function>
</xsl:stylesheet>

Mit dieser Eingabe:

<IBAN>GB82WEST12345698765432</IBAN>

Output:

Validated IBAN

EDIT : Besserer Einzeiler.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X