2016-04-20 6 views
1

Ich habe die folgende XML-Code:Attribute XSD Schemas eindeutig Iden des anderen Elements Schiedsrichter Attribute

<?xml version="1.0" encoding="UTF-8"?> 
<!--<!DOCTYPE bank SYSTEM "bank.dtd">--> 
<bank xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="bank.xsd"> 

    <accounts> 
    <savings_accounts> 
     <savings_account id="a1" interest="0.03"> 
     <balance>2500</balance> 
     </savings_account> 

     <savings_account id="a2" interest="0.03"> 
     <balance>15075</balance> 
     </savings_account> 
    </savings_accounts> 

    <checking_accounts> 
     <checking_account id="a3"> 
     <balance>4025</balance> 
     </checking_account> 
     <checking_account id="a4"> 
     <balance>-125</balance> 
     </checking_account> 
     <checking_account id="a5"> 
     <balance>325</balance> 
     </checking_account> 
    </checking_accounts> 
    </accounts> 

    <customers> 
    <customer id="c1"> 
     <name>Ben Richerdson</name> 
     <address>Park Drive 2</address> 
    </customer> 
    <customer id="c2"> 
     <name>Marc Wretcher</name> 
     <address>Mill Drive 75</address> 
    </customer> 
    <customer id="c3"> 
     <name>Angel Steady</name> 
     <address>Lake Sight 15</address> 
    </customer> 
    </customers> 


    <customer_accounts> 
    <customer_account c_id="c1" ac_id="a2"/> 
    <customer_account c_id="c1" ac_id="a3"/> 
    <customer_account c_id="c2" ac_id="a4"/> 
    <customer_account c_id="c3" ac_id="a1"/> 
    <customer_account c_id="c3" ac_id="a5"/> 
    </customer_accounts> 
</bank> 

Und ich schrieb auch das entsprechende XSD-Schema für die XML wie folgt:

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="bank"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="accounts"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="savings_accounts"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="savings_account" maxOccurs="unbounded"> 
              <xs:complexType> 
               <xs:sequence> 
                <xs:element name="balance"> 
                 <xs:simpleType> 
                  <xs:restriction base="xs:double"> 
                   <xs:minInclusive value="-5000"/> 
                  </xs:restriction> 
                 </xs:simpleType> 
                </xs:element> 
               </xs:sequence> 
               <xs:attribute name="id" type="xs:string" use="required"/> 
               <xs:attribute name="interest" type="xs:double" use="required"/> 
              </xs:complexType> 
             </xs:element> 
            </xs:sequence> 
           </xs:complexType> 
           <xs:unique name="onesavings_accountforEachid"> 
            <xs:selector xpath="xs:savings_account"/> 
            <xs:field xpath="@id"/> 
           </xs:unique> 
          </xs:element> 
          <xs:element name="checking_accounts"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="checking_account" maxOccurs="unbounded"> 
              <xs:complexType> 
               <xs:sequence> 
                <xs:element name="balance"> 
                 <xs:simpleType> 
                  <xs:restriction base="xs:double"> 
                   <xs:minInclusive value="-5000"/> 
                  </xs:restriction> 
                 </xs:simpleType> 
                </xs:element> 
               </xs:sequence> 
               <xs:attribute name="id" type="xs:string" use="required"/> 
              </xs:complexType> 
             </xs:element> 
            </xs:sequence> 
           </xs:complexType> 
           <xs:unique name="onechecking_accountforEachid"> 
            <xs:selector xpath="xs:checking_account"/> 
            <xs:field xpath="@id"/> 
           </xs:unique> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="customers"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="customer" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="name" type="xs:string"/> 
             <xs:element name="address" type="xs:string"/> 
            </xs:sequence> 
            <xs:attribute name="id" type="xs:string" use="required"/> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
        <xs:unique name="onecustomerforEachid"> 
         <xs:selector xpath="xs:customer"/> 
         <xs:field xpath="@id"/> 
        </xs:unique> 
       </xs:element> 
       <xs:element name="customer_accounts"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="customer_account" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:attribute name="c_id" type="xs:string" use="required"/> 
            <xs:attribute name="ac_id" type="xs:string" use="required"/> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Meine Frage ist also, wie kann ich die c_id = "c1" und ac_id = "a2" von customer_account auf die entsprechende ID, wie in den Konten definiert, verweisen. 'c_id' bezieht sich auf Kunden und 'ac_id' bezieht sich auf Konten.

Ich sah, dass es möglich ist, dasselbe zu tun, aber stattdessen muss ich IDs als Elemente hinzufügen und sie als privaten Schlüssel und später als Fremdschlüssel definieren.

danke für Ihre Hilfe!

Antwort

2

Ich glaube, Sie nach einem Weg zu fragen, dass

  • Für jeden Wert von customer_account/@c_id Attribut, um sicherzustellen, gibt es genau mit diesem Wert als den Wert seiner @id Attribut ein Kunde ist.
  • Für jeden Wert des Attributs customer_account/@ac_id gibt es genau einen Account (entweder einen Scheck- oder einen Sparkonto) mit diesem Wert als Wert seines @id-Attributs.
  • Keine zwei Kunden haben den gleichen @id-Wert.
  • Keine zwei Sparkonten haben den gleichen @id-Wert.
  • Keine zwei Girokonten haben den gleichen @id-Wert.

Die letzten drei Bedingungen sind bereits von den unique Elemente erzwungen Sie in den Elementen savings_accounts, checking_accounts und customers aufgenommen haben.

Wenn das ein korrektes Verständnis von dem, was Sie erreichen wollen, dann:

  • Wenn Sie sicherstellen möchten, dass jeder Wert von customer_account/@ac_id entspricht genau einem Konto, müssen Sie sicherstellen, dass kein Girokonto hat die gleiche ID wie jedes Sparkonto. Jetzt erlauben Sie Einsparungen und überprüfen Konten, IDs zu teilen. Sie müssen eine unique (oder key) Einschränkung auf accounts hinzufügen, die beide Kontoformen abdeckt. Folgendes sollte es tun:

    <xs:unique name="oneaccountforEachid"> 
        <xs:selector xpath="*/*"/> 
        <xs:field xpath="@id"/> 
    </xs:unique> 
    
  • Sie möchten zwei keyref Elemente definieren, die Angabe, dass die C_Id und a_id auf Elementattribute customer_account beziehen sich erfolgreich auf Schlüssel von Kunden und Konten.Dies kann auf dem customer_account Element gehen, wenn Sie es vorziehen:

    <xs:keyref refer="onecustomerforEachid" 
          name="ca_customer_pointer" > 
        <xs:selector xpath="."/> 
        <xs:field xpath="@c_id"/> 
    </xs:keyref> 
    <xs:keyref refer="oneaccountforEachid" 
          name="ca_account_pointer"> 
        <xs:selector xpath="."/> 
        <xs:field xpath="@ac_id"/> 
    </xs:keyref> 
    

    für mich Sprechen, ich denke, das Schema klarer sein könnte, wenn alle der Identität Zwänge auf dem bank Element waren:

    <xs:element name="bank" type="bank"> 
        <xs:unique name="account_id_unique"> 
        <xs:selector xpath="accounts/*/*"/> 
        <xs:field xpath="@id"/> 
        </xs:unique> 
        <xs:unique name="customer_id_unique"> 
        <xs:selector xpath="customers/customer"/> 
        <xs:field xpath="@id"/> 
        </xs:unique> 
        <xs:keyref name="ca_customer_id" 
          refer="customer_id_unique"> 
        <xs:selector 
         xpath="customer_accounts/customer_account"/> 
        <xs:field xpath="@c_id"/> 
        </xs:keyref> 
        <xs:keyref name="ca_account_id" 
          refer="account_id_unique"> 
        <xs:selector 
         xpath="customer_accounts/customer_account"/> 
        <xs:field xpath="@ac_id"/> 
        </xs:keyref> 
    </xs:element> 
    

Darüber hinaus möchten Sie möglicherweise Ihre vorhandenen unique Elemente zu key Elemente ändern, um zu betonen, dass jeder Kunde und jedes Konto eine @id haben muss. Eine kurze Beschreibung des Unterschieds ist: Die unique Constraints, die Sie haben (oder die gezeigten), sagen, dass, wenn ein @id-Attribut auf den angegebenen Elementen erscheint, sein Wert unter den @id-Werten dieser Elemente eindeutig sein muss. Eine key Einschränkung erfordert das gleiche und erfordert außerdem, dass alle fraglichen Elemente in der Tat ein @id-Attribut haben. Da Sie bereits das Attribut @id (über seine Deklaration) benötigen, haben die beiden in diesem Fall den gleichen Effekt.