使用 XSD 验证时对 xml 子元素进行条件检查
Posted
技术标签:
【中文标题】使用 XSD 验证时对 xml 子元素进行条件检查【英文标题】:conditional checking of xml sub elements while validating with XSD 【发布时间】:2021-01-14 11:29:31 【问题描述】:我有一个如下所示的 XML。我想要条件检查。 即
当 <datatype>
是 int <subelement>
时应该是强制性的。
当<datatype>
为布尔型时,<subelemnt>
为可选。
注意:我使用的是 xml 1.0。
这是允许的:
<element>
<name>
abc
</name>
<datatype>
int
</datatype>
<subelement>
</subelement>
</element>
这是允许的:
<element>
<name>
abc
</name>
<datatype>
bool
</datatype>
<subelement>
</subelement>
</element>
这是不允许的:
<element>
<name>
abc
</name>
<datatype>
int
</datatype>
</element>
这是基本的xsd
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="element">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:string" name="datatype"/>
<xs:element type="xs:string" name="subelement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
有可能吗?如果有例子就好了。 感谢您的宝贵时间。
【问题讨论】:
【参考方案1】:这需要 XSD 1.1,带有断言:
<xs:assert test="if (normalize-space(datatype)='int')
then exists(subelement)
else true()"/>
这在 XSD 1.0 中是不可能的。
【讨论】:
我明白了,非常感谢。以上是关于使用 XSD 验证时对 xml 子元素进行条件检查的主要内容,如果未能解决你的问题,请参考以下文章
XSD 检查所有元素是不是在整个 XML 文件中包含相同的值