4

ID 属性タイプの DTD 仕様によると、次のようになります。

妥当性制約: ID

タイプ ID の値は、Name プロダクションと一致する必要があります。名前は、このタイプの値として XML ドキュメントに複数回出現してはなりません。つまり、ID 値は、それを保持する要素を一意に識別しなければなりません (MUST)。

次の説明のうち、正しいものはどれですか?

  1. タイプ ID のすべての属性のすべてのインスタンス間で値が異なる必要があります。
  2. タイプ ID の同じ属性のすべてのインスタンス間で値が異なる必要があります。

つまり、次の DTD 宣言スニペットがあるとします。

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

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

次の XML ドキュメント スニペットは有効性制約に違反していますか?

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

両方の場合ではなく、属性の名前を と に変更したらどうbook-idですか?magazine-idid

4

1 に答える 1

6

ケース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が正しい。

于 2013-09-19T09:41:53.787 に答える