如何在DTD for XML中声明具有相同名称的元素内的元素?

时间:2011-12-10 09:50:57

标签: xml dtd

假设我们有一个名为first

的根元素

现在首先有2个子元素,分别叫做第二个和第三个,或者只是文本(#PCDATA)

第二个元素应始终在第三个元素之前声明

现在,第二个子元素可以有另一个(只有一个)第二个子元素或只有文本(#PCDATA)

第三个子元素只能有文本(#PCDATA)

所以我们可以这样:

      <first>
           <second> I'm in second </second>
           <third> I'm in third </third>
      </first>

或类似的东西:

      <first>
           <second> 
                <second> I'm in second </second>
           </second>
           <third> I'm in third </third>
      </first>

这里的困难是,如何使第一个第二个元素只能接受一个第二个子元素 虽然第二个子元素也是第二个元素,但它不能接受除文本之外的其他元素,因为它已经是另一个元素的子元素

我尝试过创建这样的东西

    <!DOCTYPE first [

        <!ELEMENT first (second,third)>
        <!ELEMENT second (#PCDATA | second, third)>
        <!ELEMENT third (#PCDATA)>
     ]>

但不幸的是,这根本不起作用

我正在使用此验证器:http://validator.w3.org/check

和此代码

  <?xml version="1.0" encoding="UTF-8" standalone="no"?>

    <!DOCTYPE first [

        <!ELEMENT first (second,third)>
        <!ELEMENT second (#PCDATA | second, third)>
        <!ELEMENT third (#PCDATA)>
     ]>

      <first>
           <second> I'm in second </second>
           <third> I'm in third </third>
      </first>

它给了我错误

任何想法?

1 个答案:

答案 0 :(得分:2)

每当您拥有混合内容模型(PCDATA和其他元素)时,您都无法使用,(“后跟”)序列运算符/连接器指定顺序。

您必须使用|(“或”)序列运算符/连接器。您也无法在同一组中混合使用,|。您还必须使用*(“零或更多”)事件指示器。

示例

<!DOCTYPE first [
<!ELEMENT first (second,third)>
<!ELEMENT second (#PCDATA|second|third)*>
<!ELEMENT third (#PCDATA)>
]>