Created
September 29, 2022 17:24
-
-
Save orbeon/0e98840c07dc676f9b2a8790501e81fa to your computer and use it in GitHub Desktop.
ISIN issue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<xh:html xmlns:xh="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" | |
xmlns:xs="http://www.w3.org/2001/XMLSchema" | |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xmlns:ev="http://www.w3.org/2001/xml-events" | |
xmlns:xi="http://www.w3.org/2001/XInclude" | |
xmlns:xxi="http://orbeon.org/oxf/xml/xinclude" | |
xmlns:xxf="http://orbeon.org/oxf/xml/xforms" | |
xmlns:map="http://www.w3.org/2005/xpath-functions/map" | |
xmlns:array="http://www.w3.org/2005/xpath-functions/array" | |
xmlns:math="http://www.w3.org/2005/xpath-functions/math" | |
xmlns:exf="http://www.exforms.org/exf/1-0" | |
xmlns:fr="http://orbeon.org/oxf/xml/form-runner" | |
xmlns:saxon="http://saxon.sf.net/" | |
xmlns:sql="http://orbeon.org/oxf/xml/sql" | |
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" | |
xmlns:fb="http://orbeon.org/oxf/xml/form-builder"> | |
<xh:head> | |
<xh:title>ISIN validation</xh:title> | |
<xf:model id="fr-form-model" xxf:expose-xpath-types="true" xxf:analysis.calculate="true"> | |
<!-- Main instance --> | |
<xf:instance id="fr-form-instance" xxf:exclude-result-prefixes="#all" xxf:index="id"> | |
<form> | |
<section-1> | |
<grid-1> | |
<control-1>US38259P5089</control-1> | |
<control-2/> | |
</grid-1> | |
</section-1> | |
</form> | |
</xf:instance> | |
<!-- Bindings --> | |
<xf:bind id="fr-form-binds" ref="instance('fr-form-instance')"> | |
<xf:bind id="section-1-bind" name="section-1" ref="section-1"> | |
<xf:bind id="grid-1-bind" ref="grid-1" name="grid-1"> | |
<xf:bind id="control-1-bind" name="control-1" ref="control-1" xxf:whitespace="trim"/> | |
<xf:bind id="control-2-bind" ref="control-2" name="control-2" xxf:whitespace="trim" | |
calculate="true() and (
 for $isin in $control-1
 return
 (
 let
 $without-checksum := substring($isin, 1, 11),
 $letter-as-numbers-string :=
 string-join(
 for $code in string-to-codepoints($without-checksum)
 return
 if ($code >= string-to-codepoints('A') and string-to-codepoints('Z') >= $code) then
 (: Letters A-Z :)
 xs:string($code - string-to-codepoints('A') + 10)
 else if ($code >= string-to-codepoints('0') and string-to-codepoints('9') >= $code) then
 (: Digits 0-9 :)
 xs:string($code - string-to-codepoints('0'))
 (: Unrecognized characters :)
 else
 '',
 ''
 ),
 $letter-as-numbers-digits :=
 for $code in string-to-codepoints($letter-as-numbers-string)
 return xs:decimal(codepoints-to-string($code)),
 $reversed-digits := reverse($letter-as-numbers-digits),
 $group-1-digits := $reversed-digits[position() mod 2 = 1],
 $group-2-digits := $reversed-digits[position() mod 2 = 0],
 $group-1-x2-decimals := for $d in $group-1-digits return $d * 2,
 $group-1-x2-string := string-join(for $d in $group-1-x2-decimals return string($d), ''),
 $group-1-x2-digits := for $code in string-to-codepoints($group-1-x2-string)
 return xs:decimal(codepoints-to-string($code)),
 $sum-digits := sum(($group-1-x2-digits, $group-2-digits)),
 $checksum-computed := string((10 - ($sum-digits mod 10)) mod 10),
 $checksum-provided := substring($isin, 12, 1)
 return
 $checksum-computed = $checksum-provided
 )
)" | |
readonly="false()"/> | |
</xf:bind> | |
</xf:bind> | |
</xf:bind> | |
<!-- Metadata --> | |
<xf:instance id="fr-form-metadata" xxf:readonly="true" xxf:exclude-result-prefixes="#all"> | |
<metadata> | |
<application-name>a</application-name> | |
<form-name>isin-bug</form-name> | |
<title xml:lang="en">ISIN validation</title> | |
<description xml:lang="en"/> | |
<created-with-version>2021.1-SNAPSHOT PE</created-with-version> | |
<library-versions> | |
<orbeon>1</orbeon> | |
</library-versions> | |
</metadata> | |
</xf:instance> | |
<!-- Attachments --> | |
<xf:instance id="fr-form-attachments" xxf:exclude-result-prefixes="#all"> | |
<attachments/> | |
</xf:instance> | |
<!-- All form resources --> | |
<xf:instance xxf:readonly="true" id="fr-form-resources" xxf:exclude-result-prefixes="#all"> | |
<resources> | |
<resource xml:lang="en"> | |
<section-1> | |
<label>Untitled Section</label> | |
</section-1> | |
<control-1> | |
<label>ISIN</label> | |
<hint/> | |
<alert/> | |
</control-1> | |
<control-2> | |
<label>Result</label> | |
<hint/> | |
</control-2> | |
</resource> | |
</resources> | |
</xf:instance> | |
</xf:model> | |
</xh:head> | |
<xh:body> | |
<fr:view> | |
<fr:body xmlns:p="http://www.orbeon.com/oxf/pipeline" xmlns:xbl="http://www.w3.org/ns/xbl" | |
xmlns:oxf="http://www.orbeon.com/oxf/processors"> | |
<fr:section id="section-1-section" bind="section-1-bind"> | |
<xf:label ref="$form-resources/section-1/label"/> | |
<fr:grid id="grid-1-grid" bind="grid-1-bind"> | |
<fr:c y="1" x="1" w="6"> | |
<xf:input id="control-1-control" bind="control-1-bind"> | |
<xf:label ref="$form-resources/control-1/label"/> | |
<xf:hint ref="$form-resources/control-1/hint"/> | |
<xf:alert ref="$fr-resources/detail/labels/alert"/> | |
</xf:input> | |
</fr:c> | |
<fr:c y="1" x="7" w="6"> | |
<xf:input id="control-2-control" bind="control-2-bind"> | |
<xf:label ref="$form-resources/control-2/label"/> | |
<xf:hint ref="$form-resources/control-2/hint"/> | |
<xf:alert ref="$fr-resources/detail/labels/alert"/> | |
</xf:input> | |
</fr:c> | |
</fr:grid> | |
</fr:section> | |
</fr:body> | |
</fr:view> | |
</xh:body> | |
</xh:html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment