7 Stimmen

Kann ich ein XSD-Schema umdefinieren, um das Attribut maxOccurs eines untergeordneten Typs zu ändern?

Ich versuche, ein XML-Schema zu erweitern, um die Anzahl der Vorkommen eines untergeordneten Elements unter einem Element zu ändern.

Im ursprünglichen Schema ist der übergeordnete Typ als solcher definiert:

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

Ich möchte es so gestalten, dass beide CrimeSchedule y CrimeMoneyAndSecurities sind sich wiederholende Elemente. Ich dachte, das könnte funktionieren (innerhalb von 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>

Allerdings erhalte ich dann die folgende Fehlermeldung:

cos-nonambig: CrimeSchedule und CrimeSchedule (oder Elemente aus deren Substitutionsgruppe) verstoßen gegen die "Unique Particle Attribution". Bei der Validierung anhand dieses Schemas würde für diese beiden Partikel eine Mehrdeutigkeit entstehen.

Dies ist sinnvoll, da diese Kinder tatsächlich im ursprünglichen Schema definiert waren. Wie kann ich also erreichen, was ich tun muss?

Gracias.

12voto

George Bina Punkte 1161

Wenn Sie eine Erweiterung vornehmen, ist das Inhaltsmodell des neuen Typs eine Abfolge aus dem Inhaltsmodell des Basistyps und dem, was Sie in Ihrem neuen Typ hinzufügen. In Ihrem Fall lautet das Inhaltsmodell für den neu definierten Typ CrimeLineBusiness_Type zum Beispiel

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

Sie können versuchen, das Gewünschte durch eine doppelte Neudefinition dieses Typs zu erreichen. Zuerst definieren Sie ihn durch Einschränkung neu, indem Sie die optionalen Elemente CrimeSchedule und CrimeMoneyAndSecurities entfernen und dann durch Erweiterung diese Elemente wieder mit der gewünschten Anzahl von Vorkommen hinzufügen. Siehe unten ein vollständiges Arbeitsbeispiel:

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>

Eine gültige XML-Instanz, 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>

Grußworte, George

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X