我想在我的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>
答案 0 :(得分:1)
我怀疑你的意思是该值必须是0到100之间的数字,或者是一个空字符串。如果是这种情况,你会在AND和OR之间混淆。
空字符串不是xs:integer的有效实例,因此您无法将此类型定义为xs:integer的限制(因为限制只能定义作为基值空间子集的值空间)。
有两种常用方法可以定义一个简单类型,其中值必须是X或者为空:
定义一个联合类型,其成员类型为X,并且派生类型 来自xs:string,其唯一允许值为“”
定义项目类型为X且其maxOccurs为1的列表类型。
(在这种情况下,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,我会让你找到一种强制执行这种附加条件的模式。