2009-06-08 14 views
7

Estoy tratando de extender un esquema XML para cambiar la cantidad de veces que un elemento secundario puede aparecer debajo de un elemento.¿Puedo redefinir un esquema XSD para cambiar el atributo maxOccurs de un elemento secundario de un tipo?

En el esquema original, el tipo de matriz se define como tal:

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

quiero que sea así tanto CrimeSchedule y CrimeMoneyAndSecurities están repitiendo elementos. Pensé que esto podría funcionar (en el interior de 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> 

Sin embargo, luego me sale el siguiente error:

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.

Esto tiene sentido, ya que los niños estaban de hecho definen en el esquema original. Entonces, ¿cómo puedo lograr lo que necesito hacer?

Gracias!

Respuesta

12

Cuando hace una extensión, el modelo de contenido del nuevo tipo es una secuencia del modelo de contenido de la base y lo que agregue en su nuevo tipo. Por ejemplo, en su caso, el modelo de contenido para el tipo CrimeLineBusiness_Type redefinido es

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

Lo que se puede tratar de lograr lo que desea es un doble redefinición de ese tipo. Primero, redefínelo por restricción, eliminando los elementos opcionales CrimeSchedule y CrimeMoneyAndSecurities y luego, por extensión, agregando esos elementos nuevamente con el número deseado de ocurrencias. Vea a continuación una muestra completa de trabajo:

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> 

Una instancia XML válido, 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> 

Saludos, George

+1

Gran explicación y solución George! Estaba empezando a perder la fe en SO, después de ver algunas respuestas incorrectas acerca de que XSD fuera votado y aceptado por el autor de la pregunta. – 13ren

+0

llegué aquí buscando la respuesta a "¿Puedo eliminar un niño mediante la redefinición?" pero creo que la respuesta de George también cubre eso indirectamente con la respuesta de "no, no sin usar un patrón similar al anterior". –

Cuestiones relacionadas