2016-04-20 3 views
1

У меня есть следующий код XML:Атрибутов XSD схемы рецензировать уникальные иды других атрибутов элементов

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

И я также написал соответствующую схему XSD для XML следующим образом:

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

Поэтому мой вопрос: как я могу ссылаться на c_id = "c1" и ac_id = "a2" customer_account на соответствующий идентификатор, определенный в учетных записях. «c_id» относится к клиентам, а «ac_id» относится к учетным записям.

Я искал, что можно сделать то же самое, но вместо этого я должен добавить id в качестве элементов и определить их как закрытый ключ, а затем внешний ключ.

благодарит за вашу помощь!

ответ

2

Я думаю, что вы просите способ гарантировать, что

  • Для каждого значения атрибута customer_account/@c_id, есть ровно один клиент с этим значением в качестве значения его @id атрибута.
  • Для каждого значения атрибута customer_account/@ac_id существует ровно одна учетная запись (или контрольная или сберегательная учетная запись) с этим значением в качестве значения ее атрибута @id.
  • Нет двух клиентов, имеющих одинаковое значение @id.
  • Нет двух сберегательных счетов, имеющих одинаковое значение @id.
  • Нет двух учетных счетов, имеющих одинаковое значение @id.

последних три ограничений уже подкрепленный unique элементов, которые вы включили в элементах savings_accounts, checking_accounts и customers.

Если это правильное понимание того, что вы пытаетесь достичь, то:

  • Если вы хотите, чтобы гарантировать, что любое значению customer_account/@ac_id матчей точно один счет, вам необходимо убедиться, что никакие проверки счетов не имеют тот же идентификатор, что и любой сберегательный счет. Прямо сейчас вы позволяете сбережениям и проверке счетов делиться идентификаторами. Вам нужно будет добавить ограничение (или key) на accounts, которое охватывает обе формы учетной записи. Ниже следует сделать это:

    <xs:unique name="oneaccountforEachid"> 
        <xs:selector xpath="*/*"/> 
        <xs:field xpath="@id"/> 
    </xs:unique> 
    
  • Вы хотите определить два keyref элементов, которые определяют, что c_id и a_id атрибуты элемента customer_account успешно относятся к ключам клиентов и счетов.Это может пойти на customer_account элемент, если вы предпочитаете:

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

    Если говорить о себе, я думаю, что схема может быть яснее, если все ограничения идентичности были на bank элемент:

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

Кроме того, вы можете изменить существующие элементы unique как элементы key, чтобы подчеркнуть, что для каждого клиента и учетной записи требуется @id. Одно краткое описание разницы заключается в следующем: ограничения unique, которые у вас есть (или показанные), говорят, что если атрибут @id отображается в указанных элементах, его значение должно быть уникальным среди значений @id для этих элементов. Для ограничения key требуется одно и то же, и, кроме того, требуется, чтобы все элементы, о которых идет речь, должны были иметь атрибут @id. Поскольку вам уже нужен атрибут @id (через его объявление), в этом случае оба эффекта имеют одинаковый эффект.

Смежные вопросы