Schematron xslt 1.0邮政编码格式验证

时间:2016-11-03 17:47:03

标签: regex xslt-1.0 schematron

我使用schematron来验证xml。我想创建一个规则来检查加拿大邮政编码(仅限格式)。有效的正则表达式为:/ [ABCEGHJKLMNPRSTVXY] \ d [ABCEGHJKLMNPRSTVWXYZ] \ d [ABCEGHJKLMNPRSTVWXYZ] \ d /

我只能使用xslt1作为绑定。我正在使用Saxon xsl库。

如果我使用此示例xml:

<address><postalcode>T2R2R2</postalcode></address>

我如何创建一个可以在schematron中验证的规则?

非常感谢任何帮助。

谢谢,

特里

1 个答案:

答案 0 :(得分:0)

XSLT 1.0不支持正则表达式。但是有一种方法可以使用Schematron规则验证这种模式:

<sch:rule context="postalcode">
        <sch:assert test="child::text()[
            string-length() = 6
            and translate(
                substring(.,1,1),
                'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                ''
            ) = ''
            and translate(
                substring(.,2,1),
                '0123456789',
                ''
            ) = ''
            and translate(
                substring(.,3,1),
                'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                ''
            ) = ''
            and translate(
                substring(.,4,1),
                '0123456789',
                ''
            ) = ''
            and translate(
                substring(.,5,1),
                'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                ''
            ) = ''
            and translate(
                substring(.,6,1),
                '0123456789',
                ''
            ) = ''

            ]">postalcode '<sch:value-of select="."/>' does not follow required pattern.</sch:assert>            
    </sch:rule>

这有点麻烦,但确实有效。

检查邮政编码是否由6个字符组成,然后依次检查每个字符。