Chỉ thị 'độc lập' có nghĩa là gì trong XML?


272

Các 'làm gì standalone' có nghĩa là chỉ trong một tài liệu XML?

Câu trả lời:


203

Các standalonetuyên bố là một cách để nói với các phân tích cú pháp để bỏ qua bất kỳ khai báo đánh dấu trong DTD . DTD sau đó chỉ được sử dụng để xác nhận.

Ví dụ, xem xét các <img>thẻ khiêm tốn . Nếu bạn nhìn vào XHTML 1.0 DTD , bạn sẽ thấy một khai báo đánh dấu cho trình phân tích cú pháp rằng <img>các thẻ phải là EMPTY và sở hữu srcaltcác thuộc tính. Khi một trình duyệt đi qua một tài liệu XHTML 1.0 và tìm thấy một <img>thẻ, nó sẽ nhận thấy rằng DTD yêu cầu srcaltcác thuộc tính và thêm chúng nếu chúng không có mặt. Nó cũng sẽ tự đóng <img>thẻ vì nó được coi là EMPTY. Đây là những gì đặc tả XML có nghĩa là "khai báo đánh dấu có thể ảnh hưởng đến nội dung của tài liệu." Sau đó, bạn có thể sử dụng standalonekhai báo để báo cho trình phân tích cú pháp bỏ qua các quy tắc này.

Có hay không trình phân tích cú pháp của bạn thực sự làm điều này là một câu hỏi khác, nhưng một trình phân tích cú pháp xác thực tuân thủ tiêu chuẩn (như trình duyệt) nên.

Lưu ý rằng nếu bạn không chỉ định DTD, thì khai báo độc lập "không có nghĩa", vì vậy không có lý do gì để sử dụng trừ khi bạn cũng chỉ định DTD.


9
Ví dụ cần sửa đổi thêm. Việc có "độc lập = 'không'" thường sẽ không đóng các thẻ XML không được tiết lộ (đây là một tính năng của SGML, nhưng không phải là XML). Xác nhận sẽ thất bại. Nó cũng sẽ không cung cấp các giá trị cho các thuộc tính BẮT BUỘC.
khaemuaset

2
"Khai báo độc lập là một cách để nói cho trình phân tích cú pháp bỏ qua mọi khai báo đánh dấu trong DTD." Điều đó không chính xác. Với standalone=yes, khai báo đánh dấu không được bỏ qua, thay vào đó chúng làm cho tài liệu là XML không hợp lệ. Bạn có phiền nếu tôi chỉnh sửa nó thành câu trả lời không?
sleske

@sleske Xin hãy thay đổi. Tác giả có thể luôn hoàn nguyên nếu anh ấy / cô ấy không vui.
Stephan

@Stephan: Cảm ơn sự khuyến khích. Thật không may, tôi không còn hiện hành trên toàn bộ công cụ XML, vì vậy tôi không thể tự tin chỉnh sửa ngay bây giờ. Hãy tự chỉnh sửa nếu bạn có kiến ​​thức cập nhật :-).
sleske

106
  • Lệnh độc lập là một thuộc tính tùy chọn trên khai báo XML.
  • Các giá trị hợp lệ là yesno, đâu nolà giá trị mặc định.
  • Thuộc tính chỉ có liên quan khi sử dụng DTD . (Thuộc tính không liên quan khi sử dụng lược đồ thay vì DTD.)
  • standalone="yes"có nghĩa là bộ xử lý XML phải sử dụng DTD chỉ để xác thực. Trong trường hợp đó, nó sẽ không được sử dụng cho:
    • giá trị mặc định cho các thuộc tính
    • khai báo thực thể
    • bình thường hóa
  • Lưu ý rằng standalone="yes"có thể thêm các ràng buộc hợp lệ nếu tài liệu sử dụng DTD bên ngoài. Khi tài liệu chứa những thứ sẽ yêu cầu sửa đổi XML, chẳng hạn như các giá trị mặc định cho các thuộc tính và standalone="yes"được sử dụng thì tài liệu không hợp lệ .
  • standalone="yes" có thể giúp tối ưu hóa hiệu suất xử lý tài liệu.

Nguồn: Thuộc tính giả độc lập chỉ có liên quan nếu sử dụng DTD


2
Việc sử dụng độc lập = "có" gây ra các ràng buộc về tính hợp lệ bổ sung (nghĩa là có thể khiến tài liệu XML không hợp lệ). Tôi đã chỉnh sửa điều này thành câu trả lời, hy vọng điều đó ổn.
sleske

2
@sleske Cảm ơn sự đóng góp của bạn. Tôi đã cố gắng đơn giản hóa chỉnh sửa của bạn trong khi vẫn nêu rõ quan điểm của bạn. Hãy chỉnh sửa lại nếu tôi hiểu sai.
Rinke


10

Khai báo đánh dấu có thể ảnh hưởng đến nội dung của tài liệu, khi được chuyển từ bộ xử lý XML sang ứng dụng; ví dụ là mặc định thuộc tính và khai báo thực thể. Khai báo tài liệu độc lập, có thể xuất hiện như một thành phần của khai báo XML, báo hiệu cho dù có các khai báo đó xuất hiện bên ngoài thực thể tài liệu hay trong các thực thể tham số hay không. [Định nghĩa: Một khai báo đánh dấu bên ngoài được định nghĩa là một khai báo đánh dấu xảy ra trong tập hợp con bên ngoài hoặc trong một thực thể tham số (bên ngoài hoặc bên trong, cái sau được bao gồm vì bộ xử lý không xác thực không bắt buộc phải đọc chúng).]

http://www.w3.org/TR/xml/#sec-rmd


12
Điều đó nghĩa là gì?
dan carter

4
Tôi đã đánh giá thấp vì điều này nên được đặt theo cách dễ hiểu đối với những người bình thường có QI trung bình.
Andrea Silvestri

8

Mục đích của standalone=yestuyên bố là đảm bảo rằng thông tin bên trong tài liệu có thể được truy xuất một cách trung thực chỉ dựa trên DTD nội bộ, tức là tài liệu có thể "độc lập" mà không cần tham chiếu bên ngoài. Xác thực một tài liệu độc lập đảm bảo rằng các bộ xử lý không xác thực sẽ có tất cả thông tin có sẵn để phân tích chính xác tài liệu.

Khai báo độc lập không phục vụ mục đích nếu một tài liệu không có DTD bên ngoài và DTD bên trong không có tham chiếu thực thể tham số, vì các tài liệu này đã hoàn toàn độc lập.

Sau đây là những tác dụng thực tế của việc sử dụng standalone=yes.

  • Buộc các bộ xử lý đưa ra lỗi khi phân tích tài liệu bằng tham chiếu thực thể tham số DTD hoặc tham số bên ngoài, nếu tài liệu chứa tham chiếu đến các thực thể không được khai báo trong DTD nội bộ (ngoại trừ văn bản thay thế của các thực thể tham số vì không yêu cầu bộ xử lý không hợp lệ phân tích cái này); amp,lt , gt, apos, Và quotlà những trường hợp ngoại lệ duy nhất

  • Khi phân tích cú pháp một tài liệu không được khai báo là độc lập, bộ xử lý không xác thực sẽ tự do dừng phân tích cú pháp DTD nội bộ ngay khi nó gặp một tham chiếu thực thể tham số. Khai báo một tài liệu dưới dạng độc lập buộc các bộ xử lý không xác thực phải phân tích các khai báo đánh dấu trong DTD nội bộ ngay cả sau khi chúng bỏ qua một hoặc nhiều tham chiếu thực thể tham số.

  • Buộc các bộ xử lý xác nhận đưa ra lỗi nếu tìm thấy bất kỳ lỗi nào sau đây trong tài liệu và các khai báo tương ứng của chúng nằm trong DTD bên ngoài hoặc trong văn bản thay thế thực thể tham số:

    • các thuộc tính có giá trị mặc định, nếu chúng không có giá trị được cung cấp rõ ràng
    • tham chiếu thực thể (trừ amp, lt, gt, apos, và quot)
    • các thuộc tính với các loại mã thông báo, nếu giá trị của thuộc tính sẽ được sửa đổi bằng cách chuẩn hóa
    • các phần tử có nội dung phần tử, nếu có bất kỳ khoảng trắng nào xuất hiện trong nội dung của chúng

Bộ xử lý không xác thực có thể xem xét truy xuất DTD bên ngoài và mở rộng tất cả các tham chiếu thực thể tham số cho các tài liệu không độc lập, mặc dù không có nghĩa vụ phải làm như vậy, tức là cài đặt standalone=yesvề mặt lý thuyết có thể cải thiện hiệu suất cho bộ xử lý không xác thực (cảnh báo spoiler: nó có lẽ sẽ không làm cho một sự khác biệt).


Các câu trả lời khác ở đây là không đầy đủ hoặc không chính xác, quan niệm sai lầm chính là

Khai báo độc lập là một cách để nói cho trình phân tích cú pháp bỏ qua mọi khai báo đánh dấu trong DTD. DTD sau đó chỉ được sử dụng để xác nhận.

standalone = "yes" có nghĩa là bộ xử lý XML phải sử dụng DTD chỉ để xác thực.

Hoàn toàn ngược lại, việc khai báo một tài liệu là độc lập sẽ thực sự buộc một bộ xử lý không xác thực để phân tích các khai báo bên trong mà nó thường phải bỏ qua (tức là các tài liệu sau một tham chiếu thực thể tham số bị bỏ qua). Bộ xử lý không xác thực vẫn phải sử dụng thông tin trong DTD nội bộ để cung cấp các giá trị thuộc tính mặc định và chuẩn hóa các thuộc tính được mã hóa, vì điều này không phụ thuộc vào xác thực.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.