Перекрестная ссылка на файлы с использованием DTD и XML (ТОЛЬКО) - PullRequest
1 голос
/ 05 декабря 2011

Мне необходимо написать два XML-файла и ограничить их с помощью DTD. Могу ли я ограничить идентификатор элемента в одном XML-файле ссылками на идентификаторы в другом файле?

<!ELEMENT SURVEY (QUESTION+)>
        <!ATTLIST SURVEY
                           [...]>
    <!ELEMENT QUESTION ([...])>
        <!ATTLIST QUESTION
                               Id ID #REQUIRED
                       Text CDATA #REQUIRED
                                         [...]       >

И я хочу, чтобы в другом XML-файле с ответами идентификатор ответов должен был ссылаться на идентификатор вопросов в первом файле. Таким образом, в РЕАКЦИЯХ можно ответить только на элемент QUESTION в SURVEY.

  <!ELEMENT RESPONSES (STUDENT+)>
  <!ELEMENT STUDENT (QUESTION*)>
  <!ATTLIST STUDENT
    id ID #REQUIRED>
  <!ELEMENT QUESTION (ANSWER+)>
  <!ATTLIST QUESTION
    **id IDREF #REQUIRED>**
                   [...]

1 Ответ

3 голосов
/ 05 декабря 2011

Если два файла разделены, вы не сможете ограничить это с помощью 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, если это поможет.) Вы могли бы сделать это со Схемой, но я не уверен.

...