8.4. 動的~markup挿入

注記: ~markupを文書の中へ動的に挿入するための~APIは、構文解析器と相互作用するので,それらの挙動は[ `~HTML文書$(および`~HTML構文解析器$), `~XML文書$(および`~XML構文解析器$) ]のどちらで利用されるかに依存して変わる。 ◎ APIs for dynamically inserting markup into the document interact with the parser, and thus their behavior varies depending on whether they are used with HTML documents (and the HTML parser) or XML documents (and the XML parser).

各 `文書$には `動的~markup挿入-時には投出する~counter@ があり、初期~時には 0 に設定されるモノトスル。 この~counterは、`~tokenから要素を作成-$する~algoと併用され,[ `~custom要素~構築子$が構文解析器から呼出されたときに,`文書$上の[ `open()$m / `close()$m / `write()$m ]が利用-可能になる ]のを防ぐために利用される。 ◎ Document objects have a throw-on-dynamic-markup-insertion counter, which is used in conjunction with the create an element for the token algorithm to prevent custom element constructors from being able to use document.open(), document.close(), and document.write() when they are invoked by the parser. Initially, the counter must be set to zero.

8.4.1. 入力~streamの~open法

%document = %document . `open()$m
`文書$をその場で置換する — それまでの~objを再利用しつつ,それが新たな`文書$であったかのように。 その~objが返される。 ◎ Causes the Document to be replaced in-place, as if it was a new Document object, but reusing the previous object, which is then returned.
結果の`文書$には、~HTML構文解析器が結付けられる — それには `document.write()$m を利用して構文解析する~dataを与えれる。 ◎ The resulting Document has an HTML parser associated with it, which can be given data to parse using document.write().
`文書$が依然として構文解析-中にある場合、この~methodの効果は無い。 ◎ The method has no effect if the Document is still being parsed.
次の場合、 `InvalidStateError$E 例外を投出する ⇒# `文書$は`~XML文書$である / `~custom要素~構築子$を現在~実行している ◎ Throws an "InvalidStateError" DOMException if the Document is an XML document. ◎ Throws an "InvalidStateError" DOMException if the parser is currently executing a custom element constructor.
%window = %document . `~openW(url, name, features)$m
`window.open()$m ~methodと同様に働く。 ◎ Works like the window.open() method.

各 `文書$には `~unload中の~openは無視する~counter@ があり、初期~時には 0 に設定されるモノトスル。 この~counterは、[ `文書を~unloadする$間に,~scriptが `document.open()$m ~methodを呼出す ]のを(直接間接問わず)防ぐために利用される。 ◎ Document objects have an ignore-opens-during-unload counter, which is used to prevent scripts from invoking the document.open() method (directly or indirectly) while the document is being unloaded. Initially, the counter must be set to zero.

各 `文書$には,真偽値をとる `作動中の構文解析器は中止された?@ があり、初期~時には ~F をとるとする。 これは、[ 文書にて`作動中の構文解析器$が中止された後 ]に[ ~scriptが[ `document.open()$m / `document.write()$m ]~methodを(直接間接問わず)呼出す ]のを防止するために利用される。 ◎ Document objects have an active parser was aborted boolean, which is used to prevent scripts from invoking the document.open() and document.write() methods (directly or indirectly) after the document's active parser has been aborted. It is initially false.

`document.open 手続き@ は, 所与の ( %文書 ) に対し,次を走らす: ◎ The document open steps, given a document, are as follows:

  1. ~IF[ %文書 は`~XML文書$である ] ⇒ ~THROW `InvalidStateError$E ◎ If document is an XML document, then throw an "InvalidStateError" DOMException exception.
  2. ~IF[ %文書 の`動的~markup挿入-時には投出する~counter$ ~GT 0 ] ⇒ ~THROW `InvalidStateError$E ◎ If document's throw-on-dynamic-markup-insertion counter is greater than 0, then throw an "InvalidStateError" DOMException.
  3. %入口~文書 ~LET `入口~大域~obj$に`結付けられている文書$ ◎ Let entryDocument be the entry global object's associated Document.
  4. ~IF[ ( %文書 の`生成元$, %入口~文書 の`生成元$ ) は`同一-生成元$でない ] ⇒ ~THROW `SecurityError$E ◎ If document's origin is not same origin to entryDocument's origin, then throw a "SecurityError" DOMException.
  5. ~IF[ %文書 には`作動中の構文解析器$がある ]~AND[ その`~script入子ng~level$ ~GT 0 ] ⇒ ~RET %文書 ◎ If document has an active parser whose script nesting level is greater than 0, then return document.

    注記: これは、 `document.open()$m が[ 構文解析-中に見出された~inline~script内で~callされたとき ]には,基本的に無視させる — ~timer~callbackや~event~handlerなどの,構文解析器によらない~taskから~callされたときには、依然として効果があるようにしつつ。 ◎ This basically causes document.open() to be ignored when it's called in an inline script found during parsing, while still letting it have an effect when called from a non-parser task such as a timer callback or event handler.

  6. ~IF[ %文書 の`~unload中の~openは無視する~counter$ ~GT 0 ] ⇒ ~RET %文書 ◎ Similarly, if document's ignore-opens-during-unload counter is greater than 0, then return document.

    注記: これは、 `document.open()$m が[ %文書 が~unloadされている間に[ `beforeunload$et / `pagehide$et / `unload$et ]~event~handlerから~callされたとき ]には,基本的に無視させる。 ◎ This basically causes document.open() to be ignored when it's called from a beforeunload, pagehide, or unload event handler while the Document is being unloaded.

  7. ~IF[ %文書 の`作動中の構文解析器は中止された?$ ~EQ ~T ] ⇒ ~RET %文書 ◎ If document's active parser was aborted is true, then return document.

    注記: これは特に、 `document.open()$m が[ `~navi$が開始された後に~callされたとき ]には,初期~構文解析-の間に限り無視させる。 更なる背景は 課題 #4723 を見よ。 ◎ This notably causes document.open() to be ignored if it is called after a navigation has started, but only during the initial parse. See issue #4723 for more background.

  8. ~IF[ %文書 が`属する閲覧文脈$ %B ~NEQ ~NULL ]~AND[ %B を`~navigate$する既存の試みがある ] ⇒ `文書の読込ngを停止する$( %文書 ) ◎ If document's browsing context is non-null and there is an existing attempt to navigate document's browsing context, then stop document loading given document.

    課題 #3447にて,[ `~navigate$~algoの進行中の~instance, 依然として~queueされたままの`~navigate$する~task ]の~~区別について調べられている。 少なくとも その課題が解決されるまでは、これら両者とも “`~navigate$する既存の試み” に数えられるべきである — この段を実装する目的においては。 ◎ Issue #3447 looks into the distinction between an ongoing instance of the navigate algorithm versus tasks to navigate that are still queued. For the purpose of implementing this step, both an ongoing instance of the navigate algorithm and tasks queued to navigate should be counted towards "an existing attempt to navigate," at least until that issue is resolved.

  9. %文書 の ~EACH( `~shadowも含む広義子孫$ %~node ) に対し ⇒ `すべての~event~listener/~event~handlerを消去する$( %~node ) ◎ For each shadow-including inclusive descendant node of document, erase all event listeners and handlers given node.
  10. %~window ~LET %文書 に`関連な大域~obj$ ◎ ↓
  11. ~IF[ %文書 ~EQ %~window に`結付けられている文書$ ] ⇒ `すべての~event~listener/~event~handlerを消去する$( %~window ) ◎ If document is the associated Document of document's relevant global object, then erase all event listeners and handlers given document's relevant global object.
  12. %文書 の`全~内容を~nodeで置換する$( ~NULL ) — 変異~eventは発火することなく ◎ Replace all with null within document, without firing any mutation events.
  13. ~IF[ %文書 は`全部的に作動中$である ]: ◎ If document is fully active, then:

    1. %新~URL ~LET %入口~文書 の`~URL$docの複製 ◎ Let newURL be a copy of entryDocument's URL.
    2. ~IF[ %入口~文書 ~NEQ %文書 ] ⇒ %新~URL の`素片$url ~SET ~NULL ◎ If entryDocument is not document, then set newURL's fragment to null.
    3. `~URLと履歴を更新する$( %文書, %新~URL ) ◎ Run the URL and history update steps with document and newURL.
  14. ~IF[ %文書 の`~iframe読込中~flag$ ~EQ ~T ] ⇒ %文書 の`~iframe読込黙秘中~flag$ ~SET ~T ◎ If document's iframe load in progress flag is set, then set document's mute iframe load flag.
  15. %文書 の`~mode$doc ~SET `no-quirks^l ◎ Set document to no-quirks mode.
  16. 次のようにされた新たな`~HTML構文解析器$を %文書 に結付ける ⇒ 符号化法の`確度$ ~SET `無関連^i

    これは、 `~scriptにより作成された構文解析器@ とされる。

    それは、次の 2 つを意味する:

    • `document.open()$m / `document.close()$m ~methodにより~closeできる。
    • その~tokenizerは、~end-of-file~tokenを発する前に,明示的な `document.close()$m の~callを待機する。
    ◎ Create a new HTML parser and associate it with document. This is a script-created parser (meaning that it can be closed by the document.open() and document.close() methods, and that the tokenizer will wait for an explicit call to document.close() before emitting an end-of-file token). The encoding confidence is irrelevant.
  17. %文書 の`現在の準備度$ ~SET `loading^l ◎ Set the current document readiness of document to "loading".
  18. `挿入~地点$ ~SET `入力~stream$の終端の直前 (入力~streamは、この時点で空になる。) ◎ Finally, set the insertion point to point at just before the end of the input stream (which at this point will be empty).
  19. ~RET %文書 ◎ Return document.

注記: `document.open 手続き$は、`文書$が[ `読込後~taskは準備済み$, `完全に読込まれ$る ]のどちらになるかには影響しない。 ◎ The document open steps do not affect whether a Document is ready for post-load tasks or completely loaded.

`open(unused1, unused2)@m ~method~手続きは ⇒ ~RET `document.open 手続き$( 此れ ) ◎ The open(unused1, unused2) method must return the result of running the document open steps with this Document object.

注記: %unused1, %unused2 引数は無視されるが、 1 〜 2 個の引数で関数を~callする~codeが働き続けられるよう,~IDLには保たれる。 それらは Web IDL の`多重定義~解決~algo$の規則に因り必要とされる — その規則は、引数が無い~callに対し `TypeError^E 例外を投出する。 heycam/webidl 課題 #581 にて、除去を許容するために~algoを変更することについて,究明-中にある。 `WEBIDL$r ◎ The unused1 and unused2 arguments are ignored, but kept in the IDL to allow code that calls the function with one or two arguments to continue working. They are necessary due to Web IDL overload resolution algorithm rules, which would throw a TypeError exception for such calls had the arguments not been there. heycam/webidl issue #581 investigates changing the algorithm to allow for their removal. [WEBIDL]

`~openW(url, name, features)@m ~method~手続きは: ◎ The open(url, name, features) method must run these steps:

  1. ~IF[ 此れは`作動中の文書$でない ] ⇒ ~THROW `InvalidAccessError$E ◎ If this Document object is not an active document, then throw an "InvalidAccessError" DOMException exception.
  2. ~RET `~window~open手続き$( %url, %name, %features ) ◎ Return the result of running the window open steps with url, name, and features.

8.4.2. 入力~streamの~close法

%document . `close()$m
`document.open()$m ~methodで~openされた入力~streamを~closeする。 ◎ Closes the input stream that was opened by the document.open() method.
次の場合、 `InvalidStateError$E 例外を投出する ⇒# `文書$は`~XML文書$である / `~custom要素~構築子$を現在~実行している ◎ Throws an "InvalidStateError" DOMException if the Document is an XML document. ◎ Throws an "InvalidStateError" DOMException if the parser is currently executing a custom element constructor.

`Document$I の `close()@m ~method~手続きは: ◎ The close() method must run the following steps:

  1. ~IF[ 此れは`~XML文書$である ] ⇒ ~THROW `InvalidStateError$E ◎ If the Document object is an XML document, then throw an "InvalidStateError" DOMException.
  2. ~IF[ 此れの`動的~markup挿入-時には投出する~counter$ ~GT 0 ] ⇒ ~THROW `InvalidStateError$E ◎ If the Document object's throw-on-dynamic-markup-insertion counter is greater than zero, then throw an "InvalidStateError" DOMException.
  3. %構文解析器 ~LET 此れの`~scriptにより作成された構文解析器$は[ 在るならば それ / 無いならば ε ] ◎ ↓
  4. ~IF[ %構文解析器 ~EQ ε ] ⇒ ~RET ◎ If there is no script-created parser associated with the document, then return.
  5. %構文解析器 の`入力~stream$の終端に`明示的な~EOF$を挿入する ◎ Insert an explicit "EOF" character at the end of the parser's input stream.
  6. ~IF[ 此れの`構文解析器を阻んでいる~script$ ~NEQ ε ] ⇒ ~RET ◎ If there is a pending parsing-blocking script, then return.
  7. %構文解析器 の~tokenizerを走らす ⇒ ~tokenizerから~tokenが発されるごとに,それを処理する。 [ ~tokenizerが`明示的な~EOF$に達するか,`~event~loopを回す$ ]時点で停止する。 ◎ Run the tokenizer, processing resulting tokens as they are emitted, and stopping when the tokenizer reaches the explicit "EOF" character or spins the event loop.

8.4.3. `document.write()^m

%document . `write(text...)$m
一般に,所与の文字列(たち)を`文書$の入力~streamに追加する。 ◎ In general, adds the given string(s) to the Document's input stream.
この~methodの挙動は、とても特異的である。 一部の事例では、`~HTML構文解析器$が走っている間に 構文解析器の状態に影響し得る — その結果、文書の~sourceに対応しない~DOMになり得る(例:書込された文字列が `<plaintext>^l や `<!--^l であった場合など)。 別の事例では、 `document.open()$m が~callされていたかのように,現在の~pageをまず消去することもある。 さらには、単純に無視されたり, 例外を投出する事例もある。 ~UAには、この~methodを介して挿入された `script^e 要素に対しては, 実行するのを避けることが明示的に許容される。 この~methodの正確な挙動は、~network待時間に依存する事例すらあり、とても~debugし難い失敗へ導く。 これらすべての理由から、この~methodは利用しないことが強く奨励される。 ◎ This method has very idiosyncratic behavior. In some cases, this method can affect the state of the HTML parser while the parser is running, resulting in a DOM that does not correspond to the source of the document (e.g. if the string written is the string "<plaintext>" or "<!--"). In other cases, the call can clear the current page first, as if document.open() had been called. In yet more cases, the method is simply ignored, or throws an exception. Users agents are explicitly allowed to avoid executing script elements inserted via this method. And to make matters even worse, the exact behavior of this method can in some cases be dependent on network latency, which can lead to failures that are very hard to debug. For all these reasons, use of this method is strongly discouraged.
次の場合、 `InvalidStateError$E 例外を投出する ⇒# `文書$は`~XML文書$である / `~custom要素~構築子$を現在~実行している ◎ Throws an "InvalidStateError" DOMException when invoked on XML documents. ◎ Throws an "InvalidStateError" DOMException if the parser is currently executing a custom element constructor.

各 `文書$には `破壊的書込は無視する~counter@ があり、初期~時には 0 に設定されるモノトスル。 この~counterは、 `script$e 要素の処理と併用され,[ 外部~scriptが、[ `document.write()$m を利用して,暗黙的に`document.open()$m を~callする ]ことにより,文書を吹飛ばす ]のを防ぐために利用される。 ◎ Document objects have an ignore-destructive-writes counter, which is used in conjunction with the processing of script elements to prevent external scripts from being able to use document.write() to blow away the document by implicitly calling document.open(). Initially, the counter must be set to zero.

`document.write 手続き@ は、所与の ( `文書$ %文書, 文字列 %入力 ) に対し,次を走らす: ◎ The document write steps, given a Document object document and a string input, are as follows:

  1. ~IF[ %文書 は`~XML文書$である ] ⇒ ~THROW `InvalidStateError$E ◎ If document is an XML document, then throw an "InvalidStateError" DOMException.
  2. ~IF[ %文書 の`動的~markup挿入-時には投出する~counter$ ~GT 0 ] ⇒ ~THROW `InvalidStateError$E ◎ If document's throw-on-dynamic-markup-insertion counter is greater than 0, then throw an "InvalidStateError" DOMException.
  3. ~IF[ %文書 の`作動中の構文解析器は中止された?$ ~EQ ~T ] ⇒ ~RET ◎ If document's active parser was aborted is true, then return.
  4. ~IF[ `挿入~地点$ ~EQ ε ]: ◎ If the insertion point is undefined, then:

    1. ~IF[ %文書 の`~unload中の~openは無視する~counter$ ~GT 0 ]~OR[ %文書 の`破壊的書込は無視する~counter$ ~GT 0 ] ⇒ ~RET ◎ If document's ignore-opens-during-unload counter is greater than 0 or document's ignore-destructive-writes counter is greater than 0, then return.
    2. `document.open 手続き$( %文書 ) ◎ Run the document open steps with document.
  5. %入力 を`入力~stream$内の`挿入~地点$に挿入する ◎ Insert input into the input stream just before the insertion point.
  6. ~IF[ %文書 の`構文解析器を阻んでいる~script$ ~NEQ ε ] ⇒ ~RET ◎ If there is no pending parsing-blocking script,\
  7. %入力 を`~HTML構文解析器$に処理させる: ◎ have the HTML parser process input,\

    • 符号位置を 1 個ずつ与え,結果の~tokenが発される度にそれを処理する。 ◎ one code point at a time, processing resulting tokens as they are emitted, and\
    • 次のいずれかが生じたときに停止する ⇒ ~tokenizerが挿入~地点に達したとき / ~tokenizerの処理が ~tree構築~段階にて中止されたとき(これは、 `script$e 終了tag~tokenが~tokenizerにより発された場合に起こり得る)。 ◎ stopping when the tokenizer reaches the insertion point or when the processing of the tokenizer is aborted by the tree construction stage (this can happen if a script end tag token is emitted by the tokenizer).

    注記: `document.write()$m ~methodが,~inlineに実行している~scriptから~callされている場合(すなわち,構文解析器が `script$e を終了tagまで構文解析したことにより,~callされた)、これは 構文解析器の再入呼出しになる。 [ 構文解析器の`静止~flag$ ~EQ ~T ]の場合、~tokenizerにおける`静止~flag検査$により,[ ~tokenizerは即時に中止され,~HTMLは構文解析されない ]ことになる。 ◎ If the document.write() method was called from script executing inline (i.e. executing because the parser parsed a set of script tags), then this is a reentrant invocation of the parser. If the parser pause flag is set, the tokenizer will abort immediately and no HTML will be parsed, per the tokenizer's parser pause flag check.

`Document$I の `write(...)@m ~method~手続きは ⇒ `document.write 手続き$( 此れ, 次に与える文字列 ) ⇒ 渡されたすべての引数を順に連結した結果 ◎ The document.write(...) method, when invoked, must run the document write steps with this Document object and a string that is the concatanation of all arguments passed.

8.4.4. `document.writeln()^m

%document . `writeln(text...)$m
所与の文字列(たち)を `文書$の入力~streamに追加した上で、改行文字も追加する。 必要とされるなら, `open()$m ~methodも暗黙的に~callする。 ◎ Adds the given string(s) to the Document's input stream, followed by a newline character. If necessary, calls the open() method implicitly first.
次の場合、 `InvalidStateError$E 例外を投出する ⇒# `文書$は`~XML文書$である / `~custom要素~構築子$を現在~実行している ◎ Throws an "InvalidStateError" DOMException when invoked on XML documents. ◎ Throws an "InvalidStateError" DOMException if the parser is currently executing a custom element constructor.
`Document$I の `writeln(...)@m ~method~手続きは ⇒ `document.write 手続き$( 此れ, 次に与える文字列 ) ⇒ 渡されたすべての引数を順に連結した結果に `000A^U LINE FEED を付加した結果 ◎ The document.writeln(...) method, when invoked, must run the document write steps with this Document object and a string that is the concatanation of all arguments passed and U+000A LINE FEED.

8.5 ~DOMの構文解析-法

`DOMParser$I ~interfaceは、文字列を[ ~HTML/~XML ]として構文解析して,新たな`文書$を作成することを,作者に許容する。 ◎ The DOMParser interface allows authors to create new Document objects by parsing strings, as either HTML or XML.

%parser = `new DOMParser()$m
新たな `DOMParser$I ~objを構築する。 ◎ Constructs a new DOMParser object.
%document = %parser . `parseFromString$m( %string, %type )
%string を, %type に応じて[ ~HTML構文解析器/~XML構文解析器 ]を利用する下で構文解析して、結果の`文書$を返す。 %type は、次に挙げるいずれかをとり得る ⇒# `text/html$mt (これは、~HTML構文解析器を呼出すことになる), (以下は、~XML構文解析器を呼出すことになる) `text/xml$mt, `application/xml$mt, `application/xhtml+xml$mt, `image/svg+xml$mt ◎ Parses string using either the HTML or XML parser, according to type, and returns the resulting Document. type can be "text/html" (which will invoke the HTML parser), or any of "text/xml", "application/xml", "application/xhtml+xml", or "image/svg+xml" (which will invoke the XML parser).
~XML構文解析器においては、 %string を構文解析できない場合、返される`文書$は,結果の~errorを述べている要素を包含することになる。 ◎ For the XML parser, if string cannot be parsed, then the returned Document will contain elements describing the resulting error.
構文解析の間は, `script$e 要素は評価されず、結果の文書の`符号化法$docは,常に`~UTF-8$になることに注意。 ◎ Note that script elements are not evaluated during parsing, and the resulting document's encoding will always be UTF-8.
上に挙げたもの以外の %type 値は、 【 `DOMParserSupportedType$I 値でないので,】 `TypeError^E 例外を投出させることになる。 ◎ Values other than the above for type will cause a TypeError exception to be thrown.

注記: `DOMParser$I の設計が,~classとして構築してから `parseFromString()$m ~methodを~callする必要があるのは、不幸な歴史的~遺物である。 この機能性を今日~設計するなら,自立的な関数にするであろう。 ◎ The design of DOMParser, as a class that needs to be constructed and then have its parseFromString() method called, is an unfortunate historical artifact. If we were designing this functionality today it would be a standalone function.

[Exposed=Window]
interface `DOMParser@I {
  constructor();

  [NewObject] `Document$I `parseFromString$m(DOMString %string, `DOMParserSupportedType$I %type);
};

enum `DOMParserSupportedType@I {
  `text/html$l,
  `text/xml$l,
  `application/xml$l,
  `application/xhtml+xml$l,
  `image/svg+xml$l
};
`new DOMParser()@m 構築子~手続きは、何もしない。 ◎ The new DOMParser() constructor steps are to do nothing.

`parseFromString(string, type)@m ~method~手続きは: ◎ The parseFromString(string, type) method steps are:

  1. %文書 ~LET 次のようにされた新たな`文書$ ⇒# `内容~型$doc ~SET %type, `~URL$doc ~SET 此れに`関連な大域~obj$に`結付けられている文書$の`~URL$doc ◎ Let document be a new Document, whose content type is type and url is this's relevant global object's associated Document's URL.

    %文書 の`符号化法$docは、既定の`~UTF-8$のままにされることになる。 特に, %文字列 を構文解析する間に見出された どの[ ~XML宣言/ `meta$e 要素 ]にも効果はない。 ◎ The document's encoding will be left as its default, of UTF-8. In particular, any XML declarations or meta elements found while parsing string will have no effect.

  2. ~IF[ %type ~EQ `text/html@l ]: ◎ Switch on type: • "text/html"

    1. %文書 の`種別$doc ~SET `html^l ◎ Set document's type to "html".
    2. `~HTML構文解析器$ %構文解析器 を作成して, %文書 に結付ける ◎ Create an HTML parser parser, associated with document.
    3. %構文解析器 の符号化法の`確度$ ~SET `無関連^i ◎ ↓
    4. %構文解析器 の`入力~stream$の中に %文字列 を設置する ◎ Place string into the input stream for parser. The encoding confidence is irrelevant.
    5. %構文解析器 を開始して,挿入した %文字列 を成すすべての文字を消費するまで走らす ◎ Start parser and let it run until it has consumed all the characters just inserted into the input stream.

      注記: 文書の`~mode$docは、この段で変異することもある。 ◎ This might mutate the document's mode.

    注記: %文書 が`属する閲覧文脈$は無いので、 ~node用の~scriptingは可能化されない。 ◎ Since document does not have a browsing context, scripting is disabled.

  3. ~ELSE: ◎ Otherwise

    1. `~XML構文解析器$ %構文解析器 を作成して, %文書 に結付ける — その~XML~scriptingの~supportは不能化する ◎ Create an XML parser parse, associated with document, and with XML scripting support disabled.
    2. %構文解析器 を利用して %文字列 を構文解析する ◎ Parse string using parser.
    3. ~IF[ 前~段の結果は[ ~XML整形式性 / ~XML名前空間 整形式性 ]~errorになった ]: ◎ If the previous step resulted in an XML well-formedness or XML namespace well-formedness error, then:

      1. ~Assert: %文書 には子~nodeは無い。 ◎ Assert: document has no child nodes.
      2. %根 ~LET `要素を作成する$( %文書, `parsererror^l, `http://www.mozilla.org/newlayout/xml/parsererror.xml^l ) ◎ Let root be the result of creating an element given document, "parsererror", and "http://www.mozilla.org/newlayout/xml/parsererror.xml".
      3. 任意選択で ⇒ 構文解析~errorの資質を述べるような属性や子を %根 に追加する ◎ Optionally, add attributes or children to root to describe the nature of the parsing error.
      4. %文書 に`~nodeを付加する$( %根 ) ◎ Append root to document.
  4. ~RET %文書 ◎ Return document.