明らかに、この質問は純粋に学術的なものです。幸いなことに、それには非常に明確な答えがあります。
CDATA 終了シーケンスをエスケープすることはできません。XML仕様のプロダクション ルール 20は非常に明確です。
[20] CData ::= (Char* - (Char* ']]>' Char*))
編集: この製品ルールは、文字通り、「CData セクションには、必要なものは何でも含めることができますが、シーケンス ']]>' を含むことができます。例外はありません。」を意味します。
EDIT2:同じセクションにも次のように書かれています:
CDATA セクション内では、CDEnd 文字列のみがマークアップとして認識されるため、左山かっことアンパサンドがリテラル形式で発生する可能性があります。<
" " および " "を使用してエスケープする必要はありません (また、エスケープすることもできません) &
。CDATA セクションはネストできません。
つまり、エンティティ参照、マークアップ、またはその他の形式の解釈された構文を使用することはできません。CDATA セクション内の唯一の解析済みテキストは]]>
であり、セクションを終了します。
したがって、]]>
CDATA セクション内でエスケープすることはできません。
EDIT3:同じセクションにも次のように書かれています:
2.7 CDATAセクション
[定義: CDATA セクションは、文字データが発生する場所であればどこでも発生する可能性があります。それらは、そうでなければマークアップとして認識される文字を含むテキストのブロックをエスケープするために使用されます。CDATA セクションは文字列 "<![CDATA[" で始まり、文字列 "]]>" で終わります:]
次に、単一の CDATA セクションの代わりに複数の隣接する CDATA セクションを含む、文字データが発生する可能性のある場所ならどこにでも CDATA セクションが存在する可能性があります。これにより、]]>
トークンを分割し、その 2 つの部分を隣接する CDATA セクションに入れることができます。
元:
<![CDATA[Certain tokens like ]]> can be difficult and <invalid>]]>
次のように書く必要があります
<![CDATA[Certain tokens like ]]]]><![CDATA[> can be difficult and <valid>]]>