2010-06-11 27 views
13

Tôi muốn có danh sách các thành phần được yêu cầu theo bất kỳ thứ tự nào được xác định trong dtd, nhưng không biết làm cách nào tôi có thể thực hiện việc này.DTD yêu cầu các phần tử đặt hàng

Ví dụ, tôi đã theo định nghĩa:

<!ELEMENT parent (child1, child2, child3)> 

khai dtd này sẽ xác nhận thành công mảnh sau xml:

<parent> 
    <child1></child1> 
    <child2></child2> 
    <child3></child3> 
</parent> 

Nhưng sau trường hợp xml sẽ không vượt qua xác nhận:

<parent> 
    <child2></child2> 
    <child1></child1> 
    <child3></child3> 
</parent> 

Một trong những giải pháp có thể là khai báo

<!ELEMENT parent (child1 | child2 | child3)> 

Nhưng trong trường hợp này, một trong các trường hợp con có thể bị thiếu mặc dù xác thực sẽ thành công.

Tôi cần khai báo phần tử dtd chính xác cho trường hợp danh sách các yếu tố bắt buộc có thể có mặt theo bất kỳ thứ tự nào.

+0

Tôi vừa mới đăng câu hỏi này cách đây vài phút. Hoàn toàn lame rằng bạn không thể tái đặt hàng này. – livingtech

Trả lời

11

ChrisF sai khi nói rằng bạn không thể làm điều này (nhưng kudo để kiểm tra thông số kỹ thuật!); DevNull [bây giờ được gọi là Daniel Haley] là đúng để nói rằng bạn có thể.

Tuy nhiên, có một biến chứng: mô hình nội dung do DevNull đưa ra cho parent vi phạm các quy tắc xác định của XML. Một cách không chính thức, các quy tắc này nói rằng trình phân tích cú pháp phải biết, mà không cần lookahead, mã thông báo trong mô hình nội dung mỗi phần tử trong tài liệu khớp với nhau.Nếu trong phần tử cha mẹ, trình phân tích cú pháp sẽ thấy child1, nó không thể biết được nếu nó vừa khớp với lần xuất hiện đầu tiên hoặc thứ hai của child1 trong mô hình nội dung của DevNull. Đây là lỗi (nhưng khi xảy ra lỗi là bộ vi xử lý không bắt buộc phải báo cáo - đó là lỗi có nghĩa là "tất cả mọi phiên cược đều bị tắt, bộ xử lý có thể làm bất cứ điều gì ở đây, bao gồm cả không nhận thấy bất kỳ điều gì sai").

Một mô hình nội dung cho mẹ mà tuân theo các quy tắc định mệnh có thể được hình thành bằng cách thanh toán ra tiền tố phổ biến, như sau:

<!ELEMENT parent ( 
        (child1, ((child2,child3) 
          | (child3,child2))) 
       | (child2, ((child1,child3) 
          | (child3,child1))) 
       | (child3, ((child1,child2) 
          | (child2,child1))) 
       ) > 

Đây là kém thuận lợi hơn so với tờ khai cho mô hình này có thể bằng các ngôn ngữ giản đồ khác, và cho hơn ba yếu tố, nó dễ bị lỗi và cực kỳ tẻ nhạt để làm bằng tay. Nhưng không thể tuyên bố mô hình nội dung bạn muốn với DTD. Hoặc có lẽ tôi nên nói rằng nó không thể chỉ dành cho các tác giả của DTD không có khả năng chịu đựng bất kỳ sự bất tiện nào.

Cũng lưu ý rằng trừ khi trình tự của trẻ em mang một số thông tin, một số cơ quan thiết kế tranh luận mạnh mẽ rằng tốt hơn để sửa một chuỗi.

+0

+1 cho câu trả lời xác định. –

2

Đọc the spec sẽ xuất hiện mà bạn không thể.

Khi trẻ em được khai báo theo trình tự được phân tách bằng dấu phẩy, trẻ em phải xuất hiện trong cùng một trình tự trong tài liệu. Trong một tuyên bố đầy đủ, các em cũng phải được khai báo, và các em cũng có thể có con.

Tôi nghĩ rằng đó là vì bạn đang khai báo một chuỗi (hoặc danh sách thứ tự nếu bạn thích) thay vì một bộ sưu tập (hoặc danh sách không có thứ tự).

+2

Er, tài liệu bạn trỏ đến không phải là [XML spec] (http://www.w3.org/TR/xml). –

9

Hãy thử:

<!ELEMENT parent (child1 | child2 | child3)*> 

có nên cho phép không hay nhiều của bất kỳ đứa trẻ, trong bất kỳ thứ tự.

+0

Tôi không nghĩ rằng điều này sẽ làm việc vì nó âm thanh như OP cần thiết tất cả 3 yếu tố con hiện tại. Điều này được dựa trên tuyên bố của OP: "Nhưng trong trường hợp này một trong những đứa trẻ có thể bị thiếu mặc dù xác nhận sẽ thành công." –

+0

Câu trả lời hay. Thật tuyệt vời để đối phó với các yếu tố không có thứ tự mà bạn biết chúng sẽ là gì, nhưng không phải là thứ tự hoặc số lượng của chúng. Cảm ơn bạn @Michael! – zeffii

2

Điều này là khó khăn khi bạn cần chính xác một trong từng yếu tố con. Đây là cách duy nhất tôi có thể nghĩ đến và nó không đẹp lắm. Nó hoạt động mặc dù ...

<!ELEMENT parent ( 
       (child1,child2,child3)| 
       (child1,child3,child2)| 
       (child2,child1,child3)| 
       (child2,child3,child1)| 
       (child3,child1,child2)| 
       (child3,child2,child1) 
       )> 

Về cơ bản tôi chỉ định mọi kết hợp có thể có chính xác một phần tử child1, child2 và child3.

Dưới đây là ví dụ mẫu. child1, child2child3 có thể theo bất kỳ thứ tự nào, nhưng chúng phải xuất hiện chính xác một lần.

<!DOCTYPE parent [ 
<!ELEMENT parent ( 
       (child1,child2,child3)| 
       (child1,child3,child2)| 
       (child2,child1,child3)| 
       (child2,child3,child1)| 
       (child3,child1,child2)| 
       (child3,child2,child1) 
       )> 
<!ELEMENT child1 (#PCDATA)> 
<!ELEMENT child2 (#PCDATA)> 
<!ELEMENT child3 (#PCDATA)> 
]> 
<parent> 
    <child2></child2> 
    <child1></child1> 
    <child3></child3> 
</parent> 
Các vấn đề liên quan