2013-03-20 5 views
0

모두, 유효성을 검사 할 xsd를 작성해야하는 XML 문서가 있습니다. XML 문서에는 여러 트랜잭션 유형이 있으며 그 중 일부는 특정 횟수가 필요하고 일부는 필요하지 않습니다. 상위 요소는 단순히 < 트랜잭션 >이고 하위 요소는 <ControlTransaction > 또는 <RetailTransaction> 일 수 있습니다.XSD 특정 하위 요소가있는 필수 요소

<?xml version="1.0" encoding="UTF-8"?> 
<RegisterDay xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:cp="urn:register"> 

<Transaction> 
    <SequenceNumber>1</SequenceNumber> 
    <ControlTransaction> 
     <ReasonCode>Register Open</ReasonCode> 
    </ControlTransaction> 
</Transaction> 

<Transaction> 
    <SequenceNumber>2</SequenceNumber> 
    <RetailTransaction> 
     ...stuff.. 
     <Total>9.99</Total> 
    </RetailTransaction> 
</Transaction> 

<Transaction> 
    <SequenceNumber>3</SequenceNumber> 
    <ControlTransaction> 
     <ReasonCode>Register Close</ReasonCode> 
    </ControlTransaction> 
</Transaction> 

</RegisterDay> 
: 문제는 내가 > 다음과 같이 "등록 닫기"의 값으로 "등록 열기"의 값과 다른를 갖는 <ReasonCode> 요소와 <ControlTransaction> 존재하는 < 거래를 필요로 할 필요가 있다는 것입니다

내 최선의 시도는 내 스키마에서 유형을 사용하는 것이지만 "같은 이름과 같은 범위를 가진 요소는 같은 유형이어야합니다."라는 메시지가 나타납니다. 이 문제를 해결하는 방법을 모르겠습니다.

<?xml version="1.0"?> 
<xs:schema 
     xmlns:cp="urn:register" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     attributeFormDefault="unqualified" 
     elementFormDefault="qualified"> 

    <xs:element name="RegisterDay">  
     <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs="1" maxOccurs="1" name="Transaction" type="TransactionRegisterOpen_type"/> 
       <xs:element minOccurs="1" maxOccurs="unbounded" name="Transaction" type="RetailTransaction_type"/> 
       <xs:element minOccurs="1" maxOccurs="1" name="Transaction" type="TransactionRegisterClose_type"/> 

      </xs:sequence> 
     </xs:complexType> 
    </xs:element>  

    <xs:simpleType name="RegisterOpen_type"> 
     <xs:restriction base="xs:string"> 
      <xs:pattern value="Register Open"/> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="RegisterClose_type"> 
     <xs:restriction base="xs:string"> 
      <xs:pattern value="Register Close"/> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="TransactionRegisterOpen_type"> 
     <xs:sequence> 
      <xs:element name="SequenceNumber" type="xs:unsignedShort"/> 
      <xs:element name="ControlTransaction"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="1" name="ReasonCode" type="RegisterOpen_type"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="TransactionRegisterClose_type"> 
     <xs:sequence> 
      <xs:element name="SequenceNumber" type="xs:unsignedShort"/> 
      <xs:element name="ControlTransaction"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="1" name="ReasonCode" type="RegisterClose_type"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="RetailTransaction_type"> 
     <xs:sequence> 
      <xs:element name="SequenceNumber" type="xs:unsignedShort"/> 
      <xs:element name="ControlTransaction"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="1" name="Total" type="xs:decimal"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType>   

</xs:schema> 

아무에게도이 문제가 있거나 의견이 있으십니까? 나는 꽤 많이 곤란하다.

+0

첫 번째 단락을 모르겠습니까? – Istao

+0

Istao, 의견을 보내 주셔서 감사합니다. 내 태그가 표시되지 않았습니다. 도움이되기를 바랍니다. – capaul1977

답변

0

아마 열거 형과 함께?

<?xml version="1.0"?> 
<xs:schema 
    xmlns:cp="urn:register" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    attributeFormDefault="unqualified" 
    elementFormDefault="qualified" 
    targetNamespace="urn:register"> 

<xs:element name="RegisterDay">  
    <xs:complexType> 
     <xs:sequence> 
      <xs:element 
       minOccurs="1" 
       maxOccurs="unbounded" 
       name="Transaction" 
       type="cp:TypeTransaction"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element>  

<xs:complexType name="TypeTransaction"> 
    <xs:sequence> 
     <xs:element name="SequenceNumber" type="xs:unsignedShort"/> 
     <xs:choice> 
      <xs:element name="RetailTransaction"/> 
      <xs:element name="ControlTransaction"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="ReasonCode"> 
        <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:enumeration value="Register Open"/> 
         <xs:enumeration value="Register Close"/> 
        </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:choice> 
    </xs:sequence> 
</xs:complexType>   

</xs:schema> 
+0

Istao : 답변 해 주셔서 감사합니다. 그러나이 두 가지 ControlTransactions (등록 열기 및 등록 닫기) 존재할 필요가 없습니다. ReasonCode는이 값으로 만 제한됩니다. – capaul1977

+0

_register open이 처음이라고 말 할 수 있습니까? 아니면 last_ close 같은 것을 등록 할 수 있습니까? – Istao

+0

아니요. 가능한 한 명확하게 XML을 단순화하려고했지만 레지스터 열기/닫기 트랜잭션 (시간 카드 펀치, 저장 열기/닫기 등) 전후에 다른 트랜잭션 요소가 있습니다. – capaul1977

관련 문제