使用 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 文件中包含相同的值

如何验证XML架构中的命名约定

具有相同元素名称但属性值不同的XML的XSD架构[关闭]

XML的验证模式DTD与XSD的区别

无法针对xsd架构验证xml doc(无法找到元素'replyMessage'的声明)

XML 和 XSD 验证失败:元素同时具有“类型”属性和“匿名类型”子项