2015-11-03 26 views
7

私は、顧客とのリクエストまたは顧客IDのどちらかを受け入れるXMLスキーマが必要です。顧客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 ny 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> 

のCustomerIdがゼロである最小の有効なXML:

<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などにするよりも0以上にする必要がある場合)

+0

これは私が探していたものです。ありがとうございます!マイナーな問題は、.netは明らかにxsd1.1をサポートしていないようです。 – Shawson

関連する問題