如何检查属性值是否为 A 那么属性 B 是强制性的,否则 xsd 1.1 中接下来会出现其他属性?
How to check if attribute value is A then attribute B is compulsory else other attribute is coming next in 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.
有什么解决方法吗?任何帮助将不胜感激。谢谢。
您可以使用断言或条件类型分配来完成。
有断言:
test="not(@network_mode='Periodic') or exists('periodic_interval')"
或者您可能会发现反转更直观:
test="not(@network_mode='Periodic' and not(exists('periodic_interval')))
使用条件类型分配,您可以编写一组 xs:alternative
元素,如果属性具有一个值,则分配一种类型(具有强制属性),如果它具有不同的类型(具有可选属性)具有不同的值。
最近我在研究 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.
有什么解决方法吗?任何帮助将不胜感激。谢谢。
您可以使用断言或条件类型分配来完成。
有断言:
test="not(@network_mode='Periodic') or exists('periodic_interval')"
或者您可能会发现反转更直观:
test="not(@network_mode='Periodic' and not(exists('periodic_interval')))
使用条件类型分配,您可以编写一组 xs:alternative
元素,如果属性具有一个值,则分配一种类型(具有强制属性),如果它具有不同的类型(具有可选属性)具有不同的值。