Условные обязательные элементы в XSD
у меня есть требование к XML-схеме, которая принимает либо запрос с клиентом, либо с идентификатором клиента. Если идентификатор клиента равен 0, нам нужны данные клиента, если он > 0, то данные клиента необязательны (они могут отправлять исправления). Мой XSD выглядит так в данный момент;
<xs:complexType>
<xs:any>
<xs:element name="UserID" type="xs:string" minOccurs="1"/>
<xs:element name="Password" type="xs:string" minOccurs="1"/>
<xs:element name="ReferenceNumber" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="CustomerId" minOccurs="1" maxOccurs="1" type="xs:integer"/>
<xs:element ref="WhereSigned"/>
<xs:element name="ContactName" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="ContactTelephone" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="ContactFax" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="ContactEmail" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element ref="MainApplicant" maxOccurs="1"/>
<xs:element ref="JointApplicant" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Asset" minOccurs="0" maxOccurs="1"/>
</xs:any>
</xs:complexType>
мне нужно что-то вроде этого... (Хотел бы я, чтобы все было так просто, но, увы ... не..)
<xs:complexType>
<xs:choice>
<xs:any>
<xs:element name="UserID" type="xs:string" minOccurs="1"/>
<xs:element name="Password" type="xs:string" minOccurs="1"/>
<xs:element name="ReferenceNumber" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="CustomerId" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element ref="WhereSigned"/>
<xs:element name="ContactName" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="ContactTelephone" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="ContactFax" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="ContactEmail" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element ref="MainApplicant" maxOccurs="1"/>
<xs:element ref="JointApplicant" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Asset" minOccurs="0" maxOccurs="1"/>
</xs:any>
<xs:any>
<xs:element name="UserID" type="xs:string" minOccurs="1"/>
<xs:element name="Password" type="xs:string" minOccurs="1"/>
<xs:element name="ReferenceNumber" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="CustomerId" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element ref="Asset" minOccurs="0" maxOccurs="1"/>
</xs:any>
</xs:choice>
</xs:complexType>
любые эксперты XSD (они вообще существуют?! кто может помочь или дать совет?
большое спасибо,
шо.
1 ответов
это возможно в XSD 1.1; ниже приведен упрощенный пример, который предполагает, что MainApplicant и WhereSigned являются обязательными, когда CustomerId равен нулю.
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xtm="http://paschidev.com/schemas/metadata/xtm">
<xsd:complexType name="Request">
<xsd:all>
<xsd:element name="UserID" type="xsd:string" />
<xsd:element name="Password" type="xsd:string" />
<xsd:element name="ReferenceNumber" type="xsd:string" minOccurs="0"/>
<xsd:element name="CustomerId" type="xsd:integer"/>
<xsd:element ref="WhereSigned" minOccurs="0"/>
<xsd:element name="ContactName" type="xsd:string" minOccurs="0" />
<xsd:element name="ContactTelephone" type="xsd:string" minOccurs="0" />
<xsd:element name="ContactFax" type="xsd:string" minOccurs="0" />
<xsd:element name="ContactEmail" type="xsd:string" minOccurs="0" />
<xsd:element ref="MainApplicant" minOccurs="0" />
<xsd:element ref="JointApplicant" minOccurs="0" />
<xsd:element ref="Asset" minOccurs="0" />
</xsd:all>
<xsd:assert test="CustomerId[. eq 0] and WhereSigned and MainApplicant or CustomerId[. ne 0]" />
</xsd:complexType>
<xsd:element name="Asset"/>
<xsd:element name="MainApplicant" />
<xsd:element name="JointApplicant" />
<xsd:element name="WhereSigned" />
</xsd:schema>
минимальный допустимый XML, когда CustomerId равен нулю:
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Request">
<UserID>UserID1</UserID>
<Password>asodasqZX==</Password>
<CustomerId>0</CustomerId>
<WhereSigned/>
<MainApplicant/>
</root>
когда CustomerId не равен нулю, то это минимальный XML:
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Request">
<UserID>UserID1</UserID>
<Password>asodasqZX==</Password>
<CustomerId>1</CustomerId>
</root>
условное можно легко контролировать (см. выражение @test); добавьте регулярные ограничения XSD по мере необходимости (например, если ваш CustomerId должен больше чем или равно нулю, чем сделать его nonNegativeInteger и т. д.)