2009-06-08 11 views
7

Sto tentando di estendere uno schema XML per modificare il numero di volte che un bambino può verificarsi sotto un elemento.Posso ridefinire uno schema XSD per modificare l'attributo maxOccurs di un figlio di un tipo?

Nello schema originale, il tipo di genitore è definito come tale:

<xsd:complexType name="CrimeLineBusiness_Type"> 
    <xsd:complexContent> 
     <xsd:extension base="PCLINEBUSINESS"> 
      <xsd:sequence> 
       <xsd:element ref="CrimeSchedule" minOccurs="0"/> 
       <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0"/> 
      </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

voglio fare in modo sia CrimeSchedule e CrimeMoneyAndSecurities stanno ripetendo gli elementi. Ho pensato che questo potrebbe funzionare (all'interno di xsd:redefine):

<xsd:complexType name="CrimeLineBusiness_Type"> 
     <xsd:complexContent> 
      <xsd:extension base="CrimeLineBusiness_Type"> 
       <xsd:sequence> 
        <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0" maxOccurs="unbounded"/> 
        <xsd:element ref="CrimeSchedule" minOccurs="0" maxOccurs="unbounded"/> 
       </xsd:sequence> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:complexType> 

Tuttavia, allora ottengo il seguente errore:

cos-nonambig: CrimeSchedule and CrimeSchedule (or elements from their substitution group) violate "Unique Particle Attribution". During validation against this schema, ambiguity would be created for those two particles.

Questo ha senso, dal momento che quei bambini sono stati infatti definiti nello schema originale. Quindi, come posso realizzare ciò che devo fare?

Grazie!

risposta

12

Quando si crea un'estensione, il modello di contenuto del nuovo tipo è una sequenza del modello di contenuto della base e qualsiasi cosa si aggiunga nel nuovo tipo. Per esempio nel caso in cui il modello di contenuto per il tipo di CrimeLineBusiness_Type ridefinito è

<xsd:sequence> 
    <xsd:sequence> 
    <xsd:element ref="CrimeSchedule" minOccurs="0"/> 
    <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0"/> 
    </xsd:sequence> 
    <xsd:sequence> 
    <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0" maxOccurs="unbounded"/> 
    <xsd:element ref="CrimeSchedule" minOccurs="0" maxOccurs="unbounded"/> 
    </xsd:sequence> 
</xsd:sequence> 

Che cosa si può cercare di ottenere ciò che si desidera è una doppia ridefinizione di quel tipo. Per prima cosa lo si ridefinisce per restrizione, rimuovendo gli elementi facoltativi di CrimeSchedule e CrimeMoneyAndSecurities e quindi per estensione aggiungendo nuovamente tali elementi con il numero desiderato di occorrenze. Vedi sotto un esempio di lavoro completo:

text.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:element name="test" type="CrimeLineBusiness_Type"/> 

    <xsd:complexType name="PCLINEBUSINESS"/> 
    <xsd:element name="CrimeSchedule"/> 
    <xsd:element name="CrimeMoneyAndSecurities"/> 

    <xsd:complexType name="CrimeLineBusiness_Type"> 
    <xsd:complexContent> 
     <xsd:extension base="PCLINEBUSINESS"> 
     <xsd:sequence> 
      <xsd:element ref="CrimeSchedule" minOccurs="0"/> 
      <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0"/> 
     </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
    </xsd:complexType> 

</xsd:schema> 

redef1.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:redefine schemaLocation="test.xsd"> 

    <xs:complexType name="CrimeLineBusiness_Type"> 
     <xs:complexContent> 
     <xs:restriction base="CrimeLineBusiness_Type"> 
      <xs:sequence/> 
     </xs:restriction> 
     </xs:complexContent> 
    </xs:complexType> 
    </xs:redefine> 
</xs:schema> 

redef2.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:redefine schemaLocation="redef1.xsd"> 
    <xs:complexType name="CrimeLineBusiness_Type"> 
     <xs:complexContent> 
     <xs:extension base="CrimeLineBusiness_Type"> 
      <xs:sequence> 
      <xs:element maxOccurs="unbounded" minOccurs="0" ref="CrimeSchedule"/> 
      <xs:element maxOccurs="unbounded" minOccurs="0" ref="CrimeMoneyAndSecurities"/> 
      </xs:sequence> 
     </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    </xs:redefine> 
</xs:schema> 

Un'istanza XML valido, Test.xml

<?xml version="1.0" encoding="UTF-8"?> 
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="redef2.xsd"> 

    <CrimeSchedule></CrimeSchedule> 
    <CrimeSchedule></CrimeSchedule> 
    <CrimeMoneyAndSecurities></CrimeMoneyAndSecurities> 
    <CrimeMoneyAndSecurities></CrimeMoneyAndSecurities> 

</test> 

Saluti, George

+1

Grande spiegazione e soluzione George! Stavo iniziando a perdere la fiducia in SO, dopo aver visto alcune risposte errate su XSD essere votato e accettato dal richiedente. – 13ren

+0

sono arrivato qui cercando la risposta a "posso cancellare un figlio tramite ridefinizione?" ma penso che la risposta di George copra anche quella indirettamente con la risposta di "no, non senza usare uno schema simile come sopra". –

Problemi correlati