如何在XSD 1.1中检查属性值是否为A,然后属性B是否为必选,否则其他属性为下一个?

时间:2018-10-01 05:40:29

标签: xml xsd xsd-validation xsd-1.1

最近我正在使用xsd 1.1,遇到一种情况,我需要检查属性“ network_mode”的值是否为“ Periodic”,然后另一个属性“ periodic_interval”必须由xml用户填充。

我尝试使用断言,但是对此感到困惑。我不知道如何在xsd中使用它。

我的xml

<profile network_mode="Periodic" periodic_interval="3600" sample_size="250">"Gyroscope"</profile>

和我的XSD

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:Test.Namespace" xmlns="urn:Test.Namespace"
elementFormDefault="qualified" 
attributeFormDefault="unqualified" 
vc:minVersion="1.1" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning">
...
<xsd:attribute name="network_mode" use="required">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="Periodic" />
                <xsd:enumeration value="Real-Time" />
         </xsd:restriction>
    </xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="periodic_interval">
    <xsd:simpleType>
        <xsd:restriction base="xsd:nonNegativeInteger">
            <xsd:assertion test="if (@network_mode = 'Periodic' and not(exists(@periodic_interval)) ) then false() else true()" />      
        </xsd:restriction>
    </xsd:simpleType>   
</xsd:attribute>
...

这在断言时给我错误。我正在使用XSD 1.1。

有任何解决方法吗?任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用断言或条件类型分配来实现。

有断言:

test="not(@network_mode='Periodic') or exists('periodic_interval')" 

或者您可能会发现反转更直观:

test="not(@network_mode='Periodic' and not(exists('periodic_interval')))

使用条件类型分配,您编写了一组xs:alternative元素,如果该元素具有一个值,则它们分配一种类型(具有强制属性),而如果具有一个值,则分配另一种类型(具有可选属性)。不同的值。