2015-11-03 121 views
7

我有一个xml模式需求,它接受客户或客户ID的请求。如果客户ID为0,那么我们需要客户数据,如果它> 0,那么客户数据是可选的(他们可以提交报表)。我的XSD目前看起来像这样;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> 

A是否有XSD专家(这些人甚至存在吗?!)谁能够伸出援手或一些建议?

非常感谢,

肖。

+3

您允许使用模式版本1.1吗?在这种情况下,你可以断言 - 'xs:assert'(http://www.w3.org/TR/xmlschema11-1/#cAssertions) – potame

+0

我已经看过这些,可以看到它可以用来引发错误依赖关于元素及其属性的值,但是我的XSD并没有足够的精力来看到如何将这个应用于条件逻辑的元素条件..:s – Shawson

回答

7

这在XSD 1.1中是可能的;下面是一个简单的例子,假设当CustomerId等于零时,MainApplicant和WhereSigned是强制性的。

<?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,当客户ID是零:

<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> 

当客户ID为非零,那么这是最小的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需要大于或等于零,而不是使其为非负整数等)

+0

这完全是我在找的东西,谢谢!次要的复杂情况是.net显然还不支持xsd1.1相信与否! – Shawson