整个问题在标题中:是否可以将特定IDREF分配给DTD中的特定ID? 我很确定这是不可能的,但我只想在此确认:P
E.g。我有一个带有ID类型属性的client和worker元素,以及带有两个属性的“order”元素,这两个属性应该引用客户端发出命令以及接收订单的worker。 来自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值,并且可以在任何工作者的“subordinates”参数中添加worker的ID。
但是,我也可以将客户端ID作为下属编写,或者在订单元素的情况下,我可以将客户端的ID值用于“wrkr_id”,将工作者的ID用于“cl_id”。有没有办法约束IDREF只接受一种ID? 或者可能有一种方法对ID属性施加约束,以使工作人员的ID从例如“w”和客户的ID以例如“c”能够至少部分地解决这个问题吗?
请,不要提出除DTD之外的其他解决方案。如果可能,我想在DTD中这样做,因为这是我课程的作业,如果可能的话,必须在DTD中完成。
谢谢!
答案 0 :(得分:2)
在SGML和XML DTD中,验证IDREF的ID池是平坦且无差别的 - 所以,不,没有办法编写DTD以确保'wrkr_id'上的IDREF引用ID在一个worker上,'client_id'指的是客户端,等等。
实际上,ID和IDREFS(以及TeX和其他文档处理工具中的类似结构)的用户经常发现使用诸如使用'cl'开始所有客户端ID以及使用'wk'开始所有工作者ID的约定是有帮助的。然后很容易使用您选择的XSLT,XQuery或文档处理工具检查所有ID和IDREF都有适当的前缀。
将更多级别的检查转移到模式语言中,以便验证可以提供更正确的更正确的保证,是XSD中更复杂的键和keyref结构的动机之一,并且(概括一点)断言Schematron和XSD 1.1。