2

整个问题都在标题中:是否可以将特定的 IDREF 分配给 DTD 中的特定 ID?我很确定这是不可能的,但我只想在这里确认一下:P

例如,我有一个带有 ID 类型属性的 client 和 worker 元素,以及带有两个属性的“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 中完成。

谢谢!

4

1 回答 1

3

在 SGML 和 XML DTD 中,验证 IDREF 所依据的 ID 池是平坦且未区分的——因此,不,没有办法编写 DTD 来确保“wrkr_id”上的 IDREF 引用工作人员的 ID , 'client_id' 指的是客户端,等等。

在实践中,ID 和 IDREFS(以及 TeX 和其他文档处理工具中的类似结构)的用户经常发现使用诸如所有客户端 ID 以“cl”开头和所有工作人员 ID 以“wk”开头的约定很有帮助;然后很容易使用 XSLT、XQuery 或您选择的文档处理工具检查所有 ID 和 IDREF 是否具有适当的前缀。

将额外级别的检查转移到模式语言中,以便验证可以提供更可靠的正确性保证,这是 XSD 中更复杂的键和 keyrefs 结构的动机之一,并且(概括一下)Schematron 和XSD 1.1 的。

于 2014-06-18T13:47:44.063 回答