2009-09-30 35 views
16

Giả sử tôi có một số sơ đồ:Sử dụng XML Schema để mở rộng một yếu tố chứ không phải là một complexType

<xsd:schema ...> 
    <xsd:element name="foo"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="fooElement" type="xs:string" /> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

này quy định một số yếu tố trong đó có foo bên trong nó một số yếu tố fooElement với kiểu chuỗi. Bây giờ tôi muốn mở rộng phần tử foo cũng có một phần tử barElement và gọi phần mở rộng này bar.

Để làm phức tạp mọi thứ, hãy giả sử người khác đã xác định foo và không thể thay đổi giản đồ. Trong khi ví dụ ở đây là tầm thường, chúng ta cũng giả sử rằng nội dung của foo có thể phức tạp hơn và việc xác định lược đồ mới không đơn giản như việc sao chép phần tử fooElement.

có hiệu quả, tôi muốn định nghĩa một schema mới:

<xsd:schema xmlns:fns="otherschema" ...> 
    <xsd:import namespace="otherschema" /> 
    <xsd:element name="bar"> 
     <xsd:complexContent> 
      <xsd:extension base="fns:foo"> 
       <xsd:sequence> 
        <xsd:element name="barElement" type="xs:string" /> 
       </xsd:sequence> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:element> 
</xsd:schema> 

Thật không may <xsd:extension> 's base thuộc tính chỉ chấp nhận lập luận kiểu XSD, không yếu tố. Làm cách nào để mở rộng một phần tử? (Tôi có thể mở rộng một phần tử không?)

+3

Câu hỏi hay, tôi muốn làm điều tương tự - và tôi hoài nghi rằng dường như không thể. Khùng! –

Trả lời

8

Tôi sẽ tạo một kiểu mới bắt chước phần tử foo và sau đó mở rộng từ phần tử đó. Mặc dù đây không phải là giải pháp tốt nhất nhưng bạn cũng có được kết quả tương tự như khi bạn có thể mở rộng phần tử trực tiếp.

<xs:complexType name="fooType"> 
    <xs:sequence> 
     <xs:element name="fooElement" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="barType"> 
    <xs:complexContent mixed="false"> 
     <xs:extension base="fooType"> 
     <xs:sequence> 
      <xs:element name="barElement" type="xs:string" /> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="bar" type="barType" /> 
+0

Điều này sẽ không buộc tôi đóng gói yếu tố mỗi khi tôi gọi nó? sẽ dẫn đến cú pháp như thay vì chỉ đơn giản là ... điều không mong muốn. –

+0

Không, kết quả là tôi nghĩ những gì bạn đang yêu cầu: Ben

+0

Với chỉnh sửa của bạn, tôi có khuynh hướng đồng ý - cảm ơn. –

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