使用DTD和XML交叉引用文件(仅限)

使用DTD和XML交叉引用文件(仅限),xml,file,dtd,Xml,File,Dtd,我需要编写两个XML文件,并使用DTD限制它们。我是否能够将一个XML文件中的元素ID限制为另一个文件中的引用ID <!ELEMENT SURVEY (QUESTION+)> <!ATTLIST SURVEY [...]> <!ELEMENT QUESTION ([...])> <!ATTLIST QUESTION

我需要编写两个XML文件,并使用DTD限制它们。我是否能够将一个XML文件中的元素ID限制为另一个文件中的引用ID

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

我希望在一个包含答案的不同XML文件中,答案的ID必须引用第一个文件中问题的ID。也就是说,回答中只能回答调查中的一个问题要素

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

**
[...]

如果这两个文件是分开的,您将无法使用DTD限制这一点。
IDREF
type属性将无法解析。您很可能会遇到错误,例如“带有标识符的元素”?“必须出现在文档中”(
??
=您的
IDREF
类型属性的值)

要仅使用DTD强制执行此操作,您需要组合数据集(测量文件和响应文件)。合并可以是物理合并两个数据集,也可以创建第三个实例,通过实体引用将两个数据集合并在一起。这将允许您验证单个实例。如果这样做的话,如果其中一个数据集发生变化,就不必再次组合数据

您必须进行一些更改,以便两个数据集可以共存;尤其是“问题”元素及其属性

下面是我思考的一个例子:

SURVEY.xml

<SURVEY>
  <QUESTION id="Q1" text="Question #1">
    <ANSWER>Answer to question #1.</ANSWER>
  </QUESTION>
</SURVEY>
<RESPONSES>
  <STUDENT id="S1">
    <QUESTION ref="Q1">
      <ANSWER>Students answer to question #1.</ANSWER>
    </QUESTION>
  </STUDENT>
</RESPONSES>

对问题1的答复。
RESPONSES.xml

<SURVEY>
  <QUESTION id="Q1" text="Question #1">
    <ANSWER>Answer to question #1.</ANSWER>
  </QUESTION>
</SURVEY>
<RESPONSES>
  <STUDENT id="S1">
    <QUESTION ref="Q1">
      <ANSWER>Students answer to question #1.</ANSWER>
    </QUESTION>
  </STUDENT>
</RESPONSES>

学生回答问题1。
COMBINED.xml

<SURVEY>
  <QUESTION id="Q1" text="Question #1">
    <ANSWER>Answer to question #1.</ANSWER>
  </QUESTION>
</SURVEY>
<RESPONSES>
  <STUDENT id="S1">
    <QUESTION ref="Q1">
      <ANSWER>Students answer to question #1.</ANSWER>
    </QUESTION>
  </STUDENT>
</RESPONSES>
(如果SURVEY.xml/RESPONSES.xml发生更改,则该DTD将被验证,不需要更改。我还将DTD放置在内部子集中,但它可以用作外部DTD。)


]>
&调查文件;
&响应文件;

除了只使用DTD之外,还可以使用XSLT或XQuery之类的工具来检查数据。(如果有帮助的话,我可以添加一个XSLT示例。)您可能可以使用Schema实现这一点,但我不确定。

这正是我需要的答案。非常感谢。@K-man-不客气。请考虑通过点击答案左边的复选标记来接受我的答案。谢谢!