0

すべて、検証するために xsd を作成する必要がある、制御できない XML ドキュメントがあります。XML ドキュメントには複数のトランザクション タイプがあり、特定の回数だけ必要なものとそうでないものがあります。親要素は単に <transaction> であり、子要素は <ControlTransaction> または <RetailTransaction> のいずれかです。問題は、次のように、<ReasonCode> 要素が "Register Open" の値を持ち、別の要素が "Register Close" の値を持つ <ControlTransaction> と共に <transaction> が存在することを要求する必要があることです。

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

私の最善の試みは、自分のスキーマで型を使用することですが、「同じ名前と同じスコープを持つ要素には同じ型が必要です」となります。これを回避する方法がわかりません。

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

誰かがこれに遭遇したり、提案がありますか? 私はかなり困惑しています。

4

1 に答える 1

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>
于 2013-03-21T18:58:06.257 に答える