3

私は DTD パーサーを書いていますが、パラメーター エンティティを展開する方法が少しわかりません。たとえば、この DTD の抜粋は有効ですか?

<!ENTITY % xx '&#37;zz;'>
<!ENTITY % zz '&#60;!ENTITY tricky "error-prone" >' >
<!ENTITY % abcd '%xx;'>
<!ENTITY % ef 'c'>
<!ENTITY % gh '%ab%ef;d;'>
%gh;

より具体的には、エンティティ gh が正しく展開されるかどうか知りたいです。私の意見では %ef; 最初に 'c' に展開し、次に新しく形成された PE 参照 %abcd; に展開する必要があります。%xx に展開する必要があります。等々。

私が見たほとんどのパーサーは、%ab を PE 参照として識別し、その PE が定義されていないために失敗します。しかし、パーサーがこのように動作することを要求する標準にはまったく参照が見つかりませんでした。私が見つけた唯一の参考文献は、 Included as PEではなく、Included in Literalでした。ここでは、置換テキストを 0x20 の先頭と 0x20 の後に 1 つずつ拡大する必要があると述べていますが、リテラルではありません。

ポインタはありますか?ありがとうございました。

4

1 に答える 1

2

この質問のコード例の最初の行は、W3C XML 勧告のこの例から取られているため、DTD エスケープの非常に複雑なロジックに慣れていない人は、そこに書かれている説明を参照してください。

より具体的には、エンティティ gh が正しく展開されるかどうか知りたいです。

いいえ、そうはなりません。これは、パラメーター エンティティの定義のgh構文が正しくないためです。パラメータエンティティ定義の構文は次のとおりです: ( ref )

PEDecl   ::=    '<!ENTITY' S '%' S Name S PEDef S? '>'
PEDef    ::=    EntityValue | ExternalID

エンティティ値の構文は次のとおりです: ( ref )

EntityValue   ::=       '"' ([^%&"] | PEReference | Reference)* '"'
                        |  "'" ([^%&'] | PEReference | Reference)* "'"

「PEReference」はパラメーター エンティティ参照 ( %Name;) であり、「参照」は一般的なエンティティ参照 ( &Name;) または文字参照 (&#123;または&#x7B) のいずれかです。(参照)

ここで[^%&"]とは、(パラメータ エンティティ) 名前生成の開始を示さない限り[^%&']、エンティティ値に文字を含めることができないことを意味します。%また、%は有効な名前文字ではありませんが、名前生成終了文字 の前にあるため;、文字シーケンス%ab%はエラーになります。%最初の記号が文字参照に置き換えられた場合に機能するはずなので、パラメーター エンティティ名への参照と見なされる%ef;前にエンティティの置換が行われます。%ab...

于 2011-11-25T07:48:51.900 に答える