javascript类型的xsd限制

xsd restriction of type javascript

本文关键字:限制 xsd 类型 javascript      更新时间:2023-09-26

我想根据模式验证我的xml,但对于某些节点,我想要比xsd模式更智能的验证。

例如,我有一个Person.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<person xmlns="urn:person.xsd">
  <name>John Smith</name>
  <id>123455</id>
</person>

我想以一种智能的方式验证ID节点:前5位数字(12345)是个人的ID,第六位数字(5)是一个校验和数字,由前五位数字的和模10(1+2+3+4+5模10=5)计算得出。

理想情况下,我希望扩展xsd模式的验证支持,以允许javascript等代码验证节点。

例如:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="urn:person.xsd" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="person">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="xs:string" />
        <xs:element name="id">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:javascript>
                var b= parseInt(input);
                var b1= parseInt(b/100000)%10;
                var b2= parseInt(b/10000)%10;
                var b3= parseInt(b/1000)%10;
                var b4= parseInt(b/100)%10;
                var b5= parseInt(b/10)%10;
                var b6= b%10;
                if (b6 == (b1+b2+b3+b4+b5)%10 )
                  return "true";
                else
                  return "false";
              </xs:javascript>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

现在这当然是不支持的。我可以将这个节点作为字符串进行验证,并在源代码中进行进一步的验证。但我想要一个通用的解决方案,我的代码除了任何xml之外,我不想要一个硬编码的解决方案。

这可能是一个常见的问题,但我一直找不到解决方案。

那么,把额外的验证信息放在哪里最好呢?

或者,有没有一种方法可以扩展MSXML或.Net的XML验证器来支持自定义验证(我的程序主要用.Net编写)?

感谢

在标准XSD中,最接近的方法是使用pattern元素。这指定了内容必须符合的正则表达式。

然而,正则表达式只适用于相当简单的验证,而不能满足您的要求。

一种选择是将脚本添加到类型的注释元素中。这是为"模式组件的以人和机器为目标的注释"而设计的。然后,您可以将此脚本作为第二阶段执行,从而创建您想要的更通用的解决方案。

由于您使用的是MSXML,因此可以使用SOM检索XSD数据类型。