2013-07-02 34 views
14

Hãy xem xét các giản đồ sau:Sự khác nhau giữa ref và kiểu trong lược đồ XML là gì?

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="Root"> 
     <xs:sequence> 
      <xs:element ref="Child" /> 
      <xs:element name="Child2" type="Child" /> 
     </xs:sequence> 
     <xs:attribute ref="Att" /> 
     <xs:attribute name="Att2" type="Att" /> 
    </xs:complexType> 

    <xs:complexType name="Child"> 
     <xs:attribute ref="Att" /> 
    </xs:complexType> 

    <xs:attribute name="Att" type="xs:integer" /> 

</xs:schema> 

Các ref để "trẻ em" trên dòng 6 thất bại, trong khi type trên dòng 7 xác nhận. Đối với thuộc tính, các ref thành công trong khi type không thành công. Tôi đang cố hiểu tại sao.

Sự hiểu biết của tôi về ref là nó chỉ đơn giản gọi một phần tử khác và xác định rằng bạn mong đợi để xem một thể hiện của kiểu được gọi (với tên được đưa ra trong định nghĩa) tại vị trí đó. Rõ ràng là tôi sai, vậy thì ref thực sự có ý nghĩa gì?

Trả lời

14

Sử dụng ref = ".." bạn đang "dán" phần tử/thuộc tính hiện tại được xác định ở địa điểm khác. Sử dụng type = ".." bạn đang gán một số cấu trúc (được định nghĩa trong complextype/simpletype) cho phần tử/thuộc tính mới. Nhìn vào sau:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tst="test" targetNamespace="test"> 

    <xs:complexType name="Root"> 
     <xs:sequence> 
      <xs:element ref="tst:Child" /> 
      <xs:element name="Child2" type="tst:ChildType" /> 
     </xs:sequence> 
     <xs:attribute ref="tst:AttRef" /> 
     <xs:attribute name="Att2" type="tst:AttType" /> 
    </xs:complexType> 

    <xs:complexType name="ChildType"> 
     <xs:attribute ref="tst:AttRef" /> 
    </xs:complexType> 

    <xs:element name="Child"> 
    </xs:element> 

    <xs:simpleType name="AttType"> 
     <xs:restriction base="xs:string"> 
      <xs:maxLength value="10" /> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:attribute name="AttRef" type="xs:integer" /> 

</xs:schema> 
+0

OK, tôi hiểu rằng 'loại' chỉ có thể tham chiếu đến định nghĩa loại - điều đó có ý nghĩa. Nhưng để làm rõ về 'ref': nó chỉ có thể trỏ đến một thể hiện trước của một phần tử và chèn một bản sao của nó? –

+2

Có, tôi nghĩ có thể nói theo cách này (nếu "ví dụ" có nghĩa là một số yếu tố cấp cao nhất được khai báo ở đâu đó trong xsd). Một điểm khác biệt: khi bạn sử dụng 'loại' thì bạn có thể có hai phần tử có tên khác với cùng cấu trúc. Khi bạn sử dụng 'ref' thì bạn có các phần tử có cùng tên hoặc cấu trúc ở mọi nơi. –

3

Trong một mô hình nội dung, yếu tố xs:element có thể là:

  1. Một tuyên bố phần tử (đưa ra tên và loại của nguyên tố này) hoặc
  2. Một tham chiếu đến tuyên bố phần tử cấp cao nhất (cung cấp tên của phần tử như một cách để xác định phần tử đó và trì hoãn việc khai báo thực tế cho loại) .

(Cùng tên/ref luân phiên áp dụng cho thuộc tính khai báo và thuộc tính tài liệu tham khảo, và có một sự phân đôi giống nhau giữa định nghĩa kiểu inline và tài liệu tham khảo với các loại tên.)

Trong ví dụ của bạn, không có đầu khai báo cấp cho một phần tử có tên là Child, vì vậy thuộc tính ref không thành công. Tôi hi vọng cái này giúp được.

0

Sự khác biệt đáng kể giữa ref và loại là với loại bạn không thể đi xa hơn một cấp, nhưng với ref, bạn có thể sử dụng một yếu tố có thể có thêm cấp độ và vv.

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