【问题标题】:DTD - uniqueness of ID attributesDTD - ID 属性的唯一性
【发布时间】:2013-09-24 05:49:31
【问题描述】:

根据the DTD specification上的ID属性类型:

有效性约束:ID

ID 类型的值必须与名称产生式相匹配。名称不得 在 XML 文档中多次作为这种类型的值出现; 即,ID 值必须唯一标识承载它们的元素。

下列哪种解释是正确的?

  1. ID 类型的所有属性的所有实例之间的值必须不同。
  2. 类型 ID 相同属性的所有实例的值必须不同。

换句话说,给定以下DTD声明sn-p:

<!ELEMENT book ANY>
<!ATTLIST book id ID>

<!ELEMENT magazine ANY>
<!ATTLIST magazine id ID>

以下 XML 文档 sn-p 是否违反有效性约束?

<book id="ID01" />
<magazine id="ID01" />

如果我将属性重命名为book-id 和magazine-id,而不仅仅是id,会怎样?

【问题讨论】:

    标签: xml dtd


    【解决方案1】:

    案例一

    格式良好的 XML 文档:

    <!DOCTYPE root SYSTEM "idtest.dtd">
    <root>
      <book id="ID01" />
      <magazine id="ID01" />
    </root>
    

    DTD:

    <!ELEMENT root ANY>
    
    <!ELEMENT book ANY>
    <!ATTLIST book id ID #IMPLIED>
    
    <!ELEMENT magazine ANY>
    <!ATTLIST magazine id ID #IMPLIED>
    

    xmllint 的输出:

    $ xmllint --postvalid idtest.xml
    <?xml version="1.0"?>
    <!DOCTYPE root SYSTEM "idtest.dtd">
    <root>
      <book id="ID01"/>
      <magazine id="ID01"/>
    </root>
    idtest.xml:4: element magazine: validity error : ID ID01 already defined
      <magazine id="ID01" />
                          ^
    idtest.xml:4: element magazine: validity error : ID ID01 already defined
    Document idtest.xml does not validate
    

    案例2

    格式良好的 XML 文档:

    <!DOCTYPE root SYSTEM "idtest.dtd">
    <root>
      <book book_id="ID01" />
      <magazine magazine_id="ID01" />
    </root>
    

    DTD:

    <!ELEMENT root ANY>
    
    <!ELEMENT book ANY>
    <!ATTLIST book book_id ID #IMPLIED>
    
    <!ELEMENT magazine ANY>
    <!ATTLIST magazine magazine_id ID #IMPLIED>
    

    xmllint 的输出:

    $ xmllint --postvalid idtest.xml
    <?xml version="1.0"?>
    <!DOCTYPE root SYSTEM "idtest.dtd">
    <root>
      <book book_id="ID01"/>
      <magazine magazine_id="ID01"/>
    </root>
    idtest.xml:4: element magazine: validity error : ID ID01 already defined
      <magazine magazine_id="ID01" />
                                   ^
    idtest.xml:4: element magazine: validity error : ID ID01 already defined
    Document idtest.xml does not validate
    

    结论:更改属性名称没有帮助。类型很重要。 ID 类型的属性值必须是唯一的。解释1是正确的。

    【讨论】:

    • 我通过在 Oxygen XML 编辑器(使用 Java)中进行验证得到了额外的确认。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    相关资源
    最近更新 更多