2014-06-18 50 views
0

整個問題在標題中:是否可以將特定IDREF分配給DTD中的特定ID? 我很確定這是不可能的,但我只想在此確認:P多個ID - 多個IDREF - 是否可以將特定IDREF分配給DTD中的speficic ID?

E.g.我有一個帶有ID類型屬性的客戶端和工作者元素,以及帶有兩個屬性的「order」元素,這兩個屬性應引用客戶端的訂單以及接收訂單的工作人員。從DTD 簡化代碼:

<!ELEMENT worker (name, salary, employmDate)> 
<!ATTLIST worker worker_id ID #REQUIRED subordinates IDREFS #IMPLIED> 

<!ELEMENT client (name)> 
<!ATTLIST client client_id ID #REQUIRED> 

<!ELEMENT order (price, date)> 
<!ATTLIST order cl_id IDREF #REQUIRED wrkr_id IDREF #REQUIRED> 

代碼工作正常,沒有錯誤驗證時,我必須用工人和客戶ID值,並且可以在任何工人「下屬」的說法增加工人的ID。

但是,我也可以將客戶端的ID作爲從屬件編寫,或者在訂單元素的情況下,我可以將客戶端的ID值用作「wrkr_id」,將工人的ID用作「cl_id」。有沒有辦法限制一個IDREF只接受一種ID? 或者,也許有一種方法可以對ID屬性進行約束,以使工作人員的ID以例如「w」和客戶的ID以例如「c」至少可以部分解決這個問題?

,建議除DTD以外的其他解決方案。如果可能的話,我想用DTD來完成,因爲這是我課程的一個任務,如果可能的話,它必須在DTD中完成。

謝謝!

回答

2

在SGML和XML DTD中,IDREF驗證的ID池是平坦且無差異的 - 因此,不,無法編寫DTD以確保'wrkr_id'上的IDREF指向工人的ID,'client_id'是指客戶,等等。

在實踐中,ID和IDREFS(以及TeX和其他文檔處理工具中的類似構造)的用戶經常發現使用約定會很有幫助,如使用'cl'開始所有客戶端ID以及使用'wk'開始所有工作者ID;那麼使用XSLT,XQuery或您選擇的文檔處理工具來檢查所有ID和IDREF是否有適當的前綴很容易。這個驗證可以爲正確性提供更堅實的保證,這是XSD中更復雜的鍵和keyrefs結構的動機之一,並且(泛化一點)爲Schematron和XSD 1.1的斷言。

相關問題