2009-06-08 34 views
7

Tôi đang cố gắng mở rộng một lược đồ XML để thay đổi số lần một đứa trẻ có thể xảy ra trong một phần tử.Tôi có thể xác định lại Lược đồ XSD để thay đổi thuộc tính maxOccurs của một kiểu con không?

Trong sơ đồ ban đầu, loại cha mẹ được định nghĩa như vậy:

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

tôi muốn làm cho nó vì vậy cả hai CrimeScheduleCrimeMoneyAndSecurities được lặp đi lặp lại các yếu tố. Tôi nghĩ điều này có thể làm việc (bên trong 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> 

Tuy nhiên, sau đó tôi nhận được lỗi sau:

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.

này có ý nghĩa, vì những trẻ em được thực sự được định nghĩa trong lược đồ gốc. Vì vậy, làm thế nào tôi có thể hoàn thành những gì tôi cần làm?

Cảm ơn!

Trả lời

12

Khi bạn thực hiện một phần mở rộng, mô hình nội dung của loại mới là một chuỗi mô hình nội dung của cơ sở và bất kỳ thứ gì bạn thêm vào loại mới của mình. Ví dụ trong trường hợp của bạn mô hình nội dung cho các loại CrimeLineBusiness_Type định nghĩa lại là

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

Những gì bạn có thể cố gắng để đạt được những gì bạn muốn là một định nghĩa kép của loại đó. Đầu tiên bạn xác định lại nó bằng cách hạn chế, loại bỏ các phần tử CrimeSchedule và CrimeMoneyAndSecurities tùy chọn và sau đó bằng cách mở rộng thêm các phần tử đó một lần nữa với số lần xuất hiện mong muốn. Xem dưới đây một mẫu làm việc đầy đủ:

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> 

Một thể hiện XML hợp lệ, 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> 

Kính trọng, George

+1

Giải thích và giải pháp tuyệt vời George! Tôi đã bắt đầu mất niềm tin vào SO, sau khi nhìn thấy một vài câu trả lời sai về XSD được bình chọn và được chấp nhận bởi người hỏi. – 13ren

+0

tôi đến đây tìm kiếm câu trả lời cho "tôi có thể xóa một đứa trẻ thông qua xác định lại không?" nhưng tôi nghĩ rằng câu trả lời của George bao gồm gián tiếp cũng như với câu trả lời của "không, không phải không sử dụng một mô hình tương tự như trên". –

Các vấn đề liên quan