如何使用XSD架构验证XML元素?

时间:2017-08-31 07:29:50

标签: xml xsd schema conditional-statements restrictions

我想在我的XSD架构中使用条件来处理我的XML文档。

我使用了限制,但它并不是很强大。

这是我到目前为止所做的一个例子:

<xs:element name="Matricule">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="valeur">
                    <xs:simpleType>
                        <xs:restriction base="xs:integer">
                            <xs:minInclusive value="0"></xs:minInclusive>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element type="xs:string" name="backgroundcolor"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>

这个例子工作正常,但我检查该值是否大于0.但我想验证值是否为整数AND如果值为空。

也许是这样的:

  

如果(值&gt; 0和值&lt; 100 AND值=&#39;&#39;)

我在谷歌上发现了一个主张断言的主题,所以我读了这个文件,然后我就这样做了

<xs:element name="Matricule">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="valeur">
                    <xs:simpleType>
                        <xs:restriction base="xs:integer">
                            <xs:minInclusive value="0"></xs:minInclusive>
                            **<xs:assertion test="($value mod 10) = 0"/>**
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element type="xs:string" name="backgroundcolor"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>

但它不起作用,我总是有错误。

带值的例子1:

<racine>
  <row>
    <Matricule>
      <valeur>55</valeur>
      <backgroundcolor></backgroundcolor>
    </Matricule>
  </row>
</racine> 

没有值的例2:

<racine>
  <row>
    <Matricule>
      <valeur></valeur>
      <backgroundcolor></backgroundcolor>
    </Matricule>
  </row>
</racine>

这两个例子需要是正确的,但这一个没有:

<racine>
  <row>
    <Matricule>
      <valeur>gfd</valeur>
      <backgroundcolor></backgroundcolor>
    </Matricule>
  </row>
</racine>

2 个答案:

答案 0 :(得分:1)

我怀疑你的意思是该值必须是0到100之间的数字,或者是一个空字符串。如果是这种情况,你会在AND和OR之间混淆。

空字符串不是xs:integer的有效实例,因此您无法将此类型定义为xs:integer的限制(因为限制只能定义作为基值空间子集的值空间)。

有两种常用方法可以定义一个简单类型,其中值必须是X或者为空:

  1. 定义一个联合类型,其成员类型为X,并且派生类型 来自xs:string,其唯一允许值为“”

  2. 定义项目类型为X且其maxOccurs为1的列表类型。

  3. (在这种情况下,X是xs:integer的限制,minInclusive = 0,maxInclusive = 100)。

    我个人更喜欢(2):如果您使用模式感知查询和转换,它会更好。但是,如果您只使用模式进行验证,则没有任何区别。

答案 1 :(得分:1)

如果你需要接受空元素,那么它们的内容不是整数类型,因为空字符串不代表数字。

您必须确定xs:string类型,并使用接受整数或空字符串的模式限制它。

这样可行:

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]*"/>
  </xs:restriction>
</xs:simpleType>

正如它所说,你接受了一个从0到9的数字,连续零次或多次。

如果你需要它也低于100,我会让你找到一种强制执行这种附加条件的模式。