Если два файла разделены, вы не сможете ограничить это с помощью DTD.Атрибут типа IDREF
не может быть разрешен.Скорее всего, вы получите такие ошибки, как 'Элемент с идентификатором "??"должен появиться в документе ' (??
= значение атрибутов типа IDREF
).
Чтобы применить это только к DTD, вам необходимо объединить наборы данных (файл SURVEY иФайл ответов).Объединение может быть либо физическим объединением двух наборов данных, либо созданием третьего экземпляра, который свяжет их вместе посредством ссылок на сущности.Это позволит вам проверить один экземпляр.Если бы вы сделали это таким образом, вам бы не пришлось снова объединять данные, если какой-либо набор данных изменится.
Вам придется внести некоторые изменения, чтобы два ваших набора данных могли сосуществовать;особенно с вашим элементом «ВОПРОС» и его атрибутами.
Вот пример того, о чем я думаю:
SURVEY.xml
<SURVEY>
<QUESTION id="Q1" text="Question #1">
<ANSWER>Answer to question #1.</ANSWER>
</QUESTION>
</SURVEY>
RESPONSES.xml
<RESPONSES>
<STUDENT id="S1">
<QUESTION ref="Q1">
<ANSWER>Students answer to question #1.</ANSWER>
</QUESTION>
</STUDENT>
</RESPONSES>
COMBINED.xml
(Это тот, который будет проверен и не долженнужно изменить, если SURVEY.xml / RESPONSES.xml изменился. Я также поместил DTD во внутреннее подмножество, но вместо этого его можно использовать как внешнее DTD.)
<!DOCTYPE COMBINED [
<!ELEMENT COMBINED (SURVEY,RESPONSES)>
<!ELEMENT SURVEY (QUESTION+)>
<!ELEMENT RESPONSES (STUDENT+)>
<!ELEMENT STUDENT (QUESTION*)>
<!ATTLIST STUDENT
id ID #REQUIRED>
<!ELEMENT QUESTION (ANSWER+)>
<!ATTLIST QUESTION
id ID #IMPLIED
ref IDREF #IMPLIED
text CDATA #IMPLIED>
<!ELEMENT ANSWER (#PCDATA)>
<!--These are the entities that point to the other XML files.-->
<!ENTITY survey-file SYSTEM "SURVEY.xml">
<!ENTITY responses-file SYSTEM "RESPONSES.xml">
]>
<COMBINED>
&survey-file;
&responses-file;
</COMBINED>
Снаружииспользуя только DTD, вы также можете использовать что-то вроде XSLT или XQuery для проверки данных.(Я могу добавить пример XSLT, если это поможет.) Вы могли бы сделать это со Схемой, но я не уверен.