#xml #dtd #idref
#xml #dtd #idref
Вопрос:
весь вопрос в названии: можно ли присвоить конкретный IDREF определенному идентификатору в DTD? Я почти уверен, что это невозможно, но я просто хочу подтвердить это здесь: P
Например, у меня есть элементы client и worker с атрибутами типа 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>
Код работает правильно, ошибок при проверке нет, я должен использовать значения идентификаторов для работников и клиентов и могу добавлять идентификаторы работников в аргумент «подчиненные» для любого работника.
Однако я могу также записать ИДЕНТИФИКАТОР клиента в качестве подчиненного или, в случае элемента order, я могу использовать значение идентификатора клиента для «wrkr_id» и идентификатор работника для «cl_id». Есть ли способ ограничить IDREF для приема только идентификаторов одного типа? Или, может быть, есть способ наложить ограничения на атрибуты идентификатора, чтобы идентификаторы работников начинались, например, с «w», а идентификаторы клиентов начинались, например, с «c», что решило бы эту проблему хотя бы частично?
Пожалуйста, воздержитесь от предложения других решений, кроме DTD. Если это возможно, я хочу сделать это в DTD, поскольку это задание для моего курса, и оно должно быть выполнено в DTD, если это возможно.
Спасибо!
Ответ №1:
В SGML и XML DTD пул идентификаторов, по которым проверяются IDREF, является плоским и недифференцированным — так что нет, нет способа написать DTD, чтобы гарантировать, что IDREF в ‘wrkr_id’ ссылается на ИДЕНТИФИКАТОР работника, что ‘client_id’ ссылается на клиента,и так далее.
На практике пользователи IDs и IDREF (и аналогичных конструкций в TeX и других инструментах обработки документов) часто считают полезным использовать соглашения, такие как начало всех идентификаторов клиентов с «cl» и всех идентификаторов рабочих с «wk»; затем это легко проверить с помощью XSLT, XQuery или документаинструмент обработки по вашему выбору, чтобы все идентификаторы и IDREF имели соответствующие префиксы.
Перенос этого дополнительного уровня проверки на язык схем, чтобы проверка могла обеспечить более надежные гарантии правильности, является одной из причин более сложной структуры ключей и ключевых ссылок в XSD и (немного обобщая) для утверждений Schematron и XSD 1.1.