Namespace trong XML Schema
Trong XML Schema, bạn có thể tạo ra các thành phần, như phần tử (element) và kiểu (type), có tên duy nhất trong namespace của schema. Một phần tử là phạm vi định nghĩa của namespace, có thể ghi đè một khai báo namespace được định nghĩa trong phần tử cha. Vì namespace định nghĩa một ngữ cảnh trong đó các identifier phải là duy nhất nên các schema có thể tích hợp các định nghĩa từ các namespace khác một cách an toàn – thậm chí là cả với các namespace cùng tên. Bài viết này sẽ giải thích một vài sắc thái của XML và các namespace trong schema, cùng với các ví dụ minh họa.
Với thuộc tính xmlns trong một XML schema, bạn có thể định nghĩa các thành phần sau:
* Một namespace mặc định, áp dụng cho các phần tử không có tiền tố (prefix)
* Các tiền tố (prefix) tham chiếu tới các namespace khác. Một tiền tố là dạng viết tắt cho một namespace. Để định nghĩa một tiền tố, thêm dấu 2 chấm (:) và tên tiền tố vào xmlns.
Xem xét ví dụ sau:
Ở đây, bạn có thể suy diễn như sau:
* xmlns:ns1 định nghĩa một tiền tố ns1, một kiểu viết tắt cho “prefixedURI”
* Namespace mặc định cho container là “defaultURI”, cũng được áp dụng cho tất cả các phần tử không ghi đè mặc định trong container, ví dụ như child. Trong ví dụ này, child cũng có thể bao gồm một khai báo namespace mặc định ghi đè khai báo namespace từ container trong ngữ cảnh của child.
Quy tắc này tương tự với việc định nghĩa một biến địa phương có cùng tên với biến thành viên trong lập trình Java. Khi ở trong phạm vi, biến địa phương sẽ ẩn biến toàn cục.
Trong trường hợp này, tiền tố ns1 là dạng viết tắt của “prefixedURI”. Do vậy, child ở trong namespace “prefixedURI”. Một cách khác để thu được kết quả tương tự là định nghĩa namespace mặc định, như sau:
Lưu ý: Không có giới hạn nào áp dụng cho số lượng tiền tố có thể tham chiếu cùng một namespace, thậm chí là trong cùng phạm vi.
Schema Namespaces
Một schema khai báo một namespace với thuộc tính targetNamespace cho các thành phần được định nghĩa toàn cục. Các thành phần đó là hậu duệ trực tiếp của phần tử schema và là những thành phần duy nhất bạn có thể tham chiếu bên ngoài schema. Nếu bỏ đi thuộc tính targetNamespace thì schema sẽ được định nghĩa mà không có namespace. Bạn có thể chỉ ra các phần tử và thuộc tính có ở trong targetNamespace hay không bằng các thuộc tính elementFormDefault và attributeFormDefault. Cú pháp như sau:
Thiết kế chung như sau:
* Định nghĩa elementFormDefault là qualified (phải tham chiếu bằng tên đầy đủ) để tất cả phần tử phải ở trong một namespace trong tài liệu XML tương ứng của schema.
* Để attrbuteFormDefault là undefined (không được xác định – đây cũng là thiết lập mặc định), do đó, có thể khiến các thuộc tính không thuộc namespace.
Để ghi đè các giá trị đó, định nghĩa form cho một thuộc tính hoặc phần tử. Ví dụ, việc định nghĩa form là unqualified đòi hỏi schema phải định nghĩa tất cả thuộc tính và phần tử trong cùng một namespace. Namespace mặc định trong tài liệu XML tương ứng không áp dụng cho các thuộc tính.
Đoạn mã dưới đây sẽ minh họa các quy tắc mà chúng ta vừa đề cập ở trên.
Ở đây, bạn có thể suy diễn như sau:
* Các phần tử, purchaseOrder, comment và complexType PurchaseOrderType, được định nghĩa trong namespace “http://www.w3.org/2001/XMLSchema/po.xsd” như một kết quả của việc định nghĩa cho targetNamespace.
* Thuộc tính elementFormDefault yêu cầu tất cả các phần tử là qualified. Để đạt được mục đích đó, các phần tử phải sử dụng hoặc tiền tố, hoặc namespace mặc định.
* Schema này không định nghĩa thuộc tính attributeFormDefault; do vậy, chúng ta giả thiết rằng unqualified là được mặc định.
Xem xét ví dụ dưới đây của một tài liệu XML tương ứng.
Ở đây, bạn có thể suy diễn như sau:
* Phần tử gốc, purchaseOrder, định nghĩa một namespace mặc định của “http://www.w3.org/2001/XMLSchema/po.xsd”, phù hợp với namespace đích của po.xsd schema. Theo cách đó, một bộ kiểm chứng schema có thể đảm bảo rằng tài liệu XML tuân theo chuẩn – có nghĩa là, sau quá trình kiểm chứng, bộ kiểm chứng sẽ cố gắng thu được định nghĩa schema phù hợp với namespace này.
* Một tiền tố namespace xsi được khai báo và chấp nhận cho tiền tố trong tài liệu XML tương ứng.
* Với thuộc tính schemaLocation, bạn có thể định nghĩa một gợi ý cho bộ kiểm chứng schema để truy cập tới định nghĩa schema . Đây là một ví dụ của thuộc tính có tiền tố. Giá trị là một danh sách ngăn cách nhau bởi dấu trắng, ánh xạ một namespace tới một URI.
* Các phần tử purchaseOrder, billTo, và shipTo, thuộc về namespace mặc định vì purchaseOrder định nghĩa một namespace mặc định, không bị ghi đè bởi bất kỳ phần tử con nào của nó.
* Thuộc tính orderDate không nằm trong một namespace vì namespace mặc định không áp dụng cho các thuộc tính.
Lưu ý: Các thuộc tính có thể không sử dụng namespace mặc định. Nếu bạn định nghĩa một tiền tố cho namespace mặc định và gắn tiền tố đó vào thuộc tính orderDate thì một lỗi kiểm chứng sẽ xuất hiện vì orderDate không nằm trong namespace.