有没有办法根据XSD中另一个元素的值创建条件要求?
这是XML输入,因此如果mT
枚举值为Prm
,则需要元素mTT
,MTV
和mTR
:
<mT>Prm</mT>
<mTT>H</mTT>
<mTV>25</mTV>
<mTR>Re</mTR>
架构:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
<xs:complexType name="ciType">
<xs:all>
<xs:element name="mT">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Cm"/>
<xs:enumeration value="Com"/>
<xs:enumeration value="Prm"/>
</xs:restriction>
</xs:simpleType>
</element>
<xs:element name="mTV">
<xs:simpleType>
<xs:restriction base="xs:double">
<xs:minInclusive value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="mTR">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="N-r"/>
<xs:enumeration value="Re"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="mTT">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="C"/>
<xs:enumeration value="D"/>
<xs:enumeration value="H"/>
<xs:enumeration value="M"/>
<xs:enumeration value="W"/>
<xs:enumeration value="Y"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
答案 0 :(得分:0)
我不知道有什么方法可以做到这一点。您可以将枚举转换为元素:
<Prm>
<mTT>H</mTT>
<mTV>25</mTV>
<mTR>Re</mTR>
</Prm>
<xs:complexType name="ciType">
<xs:choice>
<xs:element name="Cm" type="ciTypeCm"/>
<xs:element name="Com" type="ciTypeCom"/>
<xs:element name="Prm" type="ciTypePrm"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="ciTypePrm">
<xs:all>
<xs:element name="mTV">
<xs:simpleType>
<xs:restriction base="xs:double">
<xs:minInclusive value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="mTR">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="N-r"/>
<xs:enumeration value="Re"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="mTT">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="C"/>
<xs:enumeration value="D"/>
<xs:enumeration value="H"/>
<xs:enumeration value="M"/>
<xs:enumeration value="W"/>
<xs:enumeration value="Y"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:all>
</xs:complexType>
答案 1 :(得分:0)
您无法在XSD 1.0中执行此操作。您可以使用断言在XSD 1.1中执行此操作。
答案 2 :(得分:0)
作为Michael Kay answered,XSD 1.0无法表达这样的约束,但XSD 1.1断言可以。这是符合您要求的xs:assertion
:
<xs:assert test="(mT != 'Prm' or (mTV and mTR and mTT))"/>
以下是在完整的XSD 1.1中ciType
声明的上下文中的断言:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="r" type="ciType"/>
<xs:complexType name="ciType">
<xs:all>
<xs:element name="mT">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Cm"/>
<xs:enumeration value="Com"/>
<xs:enumeration value="Prm"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="mTV" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:double">
<xs:minInclusive value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="mTR" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="N-r"/>
<xs:enumeration value="Re"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="mTT" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="C"/>
<xs:enumeration value="D"/>
<xs:enumeration value="H"/>
<xs:enumeration value="M"/>
<xs:enumeration value="W"/>
<xs:enumeration value="Y"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:all>
<xs:assert test="(mT != 'Prm' or (mTV and mTR and mTT))"/>
</xs:complexType>
</xs:schema>