Несколько идентификаторов — несколько IDREF — можно ли назначить конкретный IDREF конкретному идентификатору в DTD?

весь вопрос в заголовке: можно ли присвоить конкретный IDREF конкретному ID в DTD? Я почти уверен, что это невозможно, но я просто хочу подтвердить это здесь: P

Например. У меня есть клиентский и рабочий элементы с атрибутами типа ID и элемент «заказ» с двумя атрибутами, которые должны относиться к клиенту, делающему заказ, и к работнику, который получает заказ. Упрощенный код из 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>

Код работает правильно, при проверке ошибок нет, я должен использовать значения идентификаторов для воркеров и клиентов и могу добавить идентификаторы воркеров в аргумент «подчиненные» для любого воркера.

Однако я также могу написать идентификатор клиента в качестве подчиненного или, в случае элемента заказа, я могу использовать значение идентификатора клиента для «wrkr_id» и идентификатор работника для «cl_id». Есть ли способ заставить IDREF принимать только идентификаторы одного типа? Или, может быть, есть способ наложить ограничения на атрибуты идентификатора, чтобы идентификаторы рабочих начинались, например, с. "w" и идентификаторы клиентов начинаются, например, с. "c", который решил бы эту проблему хотя бы частично?

Пожалуйста, воздержитесь от предложений других решений, кроме DTD. Если это возможно, я хочу сделать это в DTD, так как это задание для моего курса, и, если возможно, оно должно быть выполнено в DTD.

Спасибо!


person bochen421    schedule 18.06.2014    source источник


Ответы (1)


В DTD SGML и XML пул идентификаторов, по которым проверяются IDREF, является плоским и недифференцированным, поэтому нет способа написать DTD, чтобы гарантировать, что IDREF в «wrkr_id» ссылается на идентификатор в рабочем потоке. , что client_id относится к клиенту и так далее.

На практике пользователи идентификаторов и IDREFS (и аналогичных конструкций в TeX и других инструментах обработки документов) часто считают полезным использовать такие соглашения, как начало всех идентификаторов клиентов с «cl» и всех идентификаторов рабочих с «wk»; затем легко проверить с помощью XSLT, XQuery или инструмента обработки документов по вашему выбору, что все идентификаторы и IDREF имеют соответствующие префиксы.

Перемещение этого дополнительного уровня проверки на язык схемы, чтобы проверка могла обеспечить более надежные гарантии правильности, является одной из причин более сложной структуры ключей и ссылок на ключи в XSD и (немного обобщая) утверждений Schematron и XSD 1.1.

person C. M. Sperberg-McQueen    schedule 18.06.2014