Ogólne#
Parsing & Serialization#
W tym miejscu umieszczam powtarzające się specyficzne pojęcia i algorytmy w dziale PARSING & SERIALIZATION, czyli mogą mieć one zastosowanie dla wszystkich interfejsów z tego działu.
Algorytmy#
fragment parsing algorithm
Poniższe kroki tworzą algorytm parsowania fragmentu # (fragment parsing algorithm), którego argumentami są łańcuch znakowy markup i element kontekstu context element:
Jeśli właścicielem context element jest dokument HTML, to niech algorithm będzie algorytmem parsowania fragmentu HTML.
Jeśli właścicielem context element jest dokument XML, to niech algorithm będzie algorytmem parsowania fragmentu XML.
- Niech new children będzie wynikiem działania algorithm z wejściem będącym markup oraz z elementem kontekstu w postaci context element.
- Niech fragment będzie nowym obiektem typu
DocumentFragment
, którego właścicielem jest właściciel w context element. Dodaj, zgodnie z porządkiem drzewa, każdy węzeł z new children do fragment.
Krok ten gwarantuje, że właściciel dla nowych węzłów jest prawidłowy.
- Zwróć zawartość fragment.
fragment serializing algorithm
Poniższe kroki tworzą algorytm serializacji fragmentu # (fragment serializing algorithm), którego argumentami są węzeł node i flaga wymaganego dobrego sformułowania require well-formed:
- Niech context document będzie właścicielem node.
- Jeśli context document jest dokumentem HTML, to wykonaj serializację HTML dla node.
W przeciwnym razie context document jest dokumentem XML. Wykonaj serializację XML dla node z przekazaniem flagi require well-formed.
Serializacja XML definiowana przez specyfikację P&S spełnia wymagania algorytmu serializacji fragmentu XML definiowanego w specyfikacji HTML5.
HTML serialization
Aby wyprodukować serializację HTML # (HTML serialization) węzła node aplikacja kliencka musi wykonać następujące kroki:
- Uruchom algorytm serializacji fragmentu HTML na node i zwróć wyprodukowany łańcuch znakowy.
XML serialization
Aby wyprodukować serializację XML # (XML serialization) węzła node z przekazaniem flagi wymaganego dobrego sformułowania require well-formed aplikacja kliencka musi wykonać następujące kroki:
- Niech przestrzeń nazw kontekstu # (context namespace) ma wartość
null
. Przestrzeń nazw kontekstu jest zmieniana w chwili, kiedy node serializuje inną domyślną definicję przestrzeni nazw ze swojego rodzica. Algorytm zakłada brak przestrzeni nazw na starcie. Niech mapa prefiksu przestrzeni nazw # (namespace prefix map) będzie nową mapą dla skojarzonych par namespaceURI i prefix z przestrzeni nazw, gdzie wartości namespaceURI są kluczami mapy a wartości prefix są wartościami kluczy mapy. Mapa prefiksu przestrzeni nazw będzie wypełniana wcześniejszymi obecnymi adresami URI przestrzeni nazw i ich najnowszymi przypisanymi prefiksami dla poddrzewa.
Mapa prefiksu przestrzeni nazw kojarzy jedynie pojedynczą wartość prefiksu z danym adresem URI przestrzeń nazw. W czasie serializacji, kiedy różne prefiksy przestrzeń nazw zostaną odnalezione i pasują do tego samego adresu URI przestrzeni nazw, to ostatni napotkany "wygrywa", zastępując istniejącą wartość klucza w mapie nową wartością prefiksu.
- Zainicjuj mapę prefiksu przestrzeni nazw z kluczem będącym przestrzenią nazw XML i wartością klucza w postaci łańcucha znakowego "
xml
". - Niech wygenerowany indeks prefiksu przestrzeni nazw # (generated namespace prefix index) będzie liczbą całkowitą o wartości
1
. Wygenerowany indeks prefiksu przestrzeni nazw jest stosowany do wytworzenia nowej unikatowej wartości prefiksu, kiedy nie ma dostępu do żadnego innego prefiksu przy serializacji adresu URI przestrzeń nazw dla node (lub adresu URI przestrzeń nazw dla atrybutów node). Zobacz algorytm generowania prefiksu. - Zwróć rezultat uruchomienia algorytmu serializacji XML na node z przekazaniem przestrzeni nazw kontekstu, mapy prefiksu przestrzeni nazw, referencji do wygenerowanego indeksu prefiksu przestrzeni nazw i flagi require well-formed. Jeśli w czasie wykonywania algorytmu pojawi się wyjątek # (exception) to należy go przechwycić i zrzucić wyjątek DOM o nazwie
"InvalidStateError"
.
Serializacja XML różnie się od serializacji HTML w następujących obszarach:
- Elementy i atrybuty będą zawsze serializowane z zachowaniem adresu URI przestrzeni nazw. W niektórych przypadkach oznacza to, że istniejący prefiks, atrybut deklarujący prefiks lub atrybut deklarujący domyślną przestrzeń nazw może zostać porzucony, podstawiony lub zmieniony. Serializacja HTML nie próbuje zachować adresu URI przestrzeni nazw.
- Elementy poza przestrzenią nazw HTML i bez żadnej zawartości są serializowane przy użyciu składni samozamykającego znacznika (zgodnie z produkcją
EmptyElemTag
w XML).
Trzeba jednak zaznaczyć, że algorytm do produkcji serializacji XML został zaprojektowany w celu przeprowadzenia serializacji zgodnej z parserem HTML. Dla przykładu, elementy w przestrzeni nazw HTML i bez żadnej zawartości są serializowane z jawnym otwierającym i zamykającym znacznikiem, a nie przy użyciu składni samozamykającego znacznika.
Zgodnie z najnowszymi wymaganiami specyfikacji DOM4 obiekty atrybutów nie dziedziczą z interfejsu Node (szczegóły), i tym samym nie mogą być serializowane przez algorytm serializacji XML. Próba serializacji obiektu atrybutu wygeneruje wyjątek TypeError
.
XML serialization algorithm
Aby uruchomić algorytm serializacji XML # (XML serialization algorithm) węzła node z przekazaniem przestrzeni nazw kontekstu namespace, mapy prefiksu przestrzeni nazw prefix map, wygenerowanego indeksu prefiksu przestrzeni nazw prefix index i flagi wymaganego dobrego sformułowania require well-formed aplikacja kliencka musi wykonać następujące kroki, w zależności od interfejsu node:
- Dla węzła typu
Element
: - Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
true
) i atrybutlocalName
w node zawiera znak ":
" (U+003A COLON
) lub nie pasuje do produkcjiName
z XML, to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowanym elementem. - Niech markup będzie łańcuchem znakowym "
<
" (U+003C LESS-THAN SIGN
). - Niech qualified name będzie pustym łańcuchem znakowym.
- Niech flaga skip end tag ma boolowską wartość
false
. - Niech flaga ignore namespace definition attribute ma boolowską wartość
false
. - Niech map będzie kopią prefix map.
Niech element prefixes list będzie pustą listą.
Lista ta jest lokalna dla każdego elementu. Jej celem jest zapewnienie, że dla uniknięcia konfliktowych prefiksów nowy atrybut prefiksu przestrzeni nazw powinien być wygenerowany.
- Niech duplicate prefix definition będzie wartością
null
. Niech local default namespace będzie wynikiem zapisu informacji przestrzeni nazw dla node z przekazaniem map, element prefixes list i duplicate prefix definition.
Powyższy krok aktualizuje map przez wszystkie odnalezione definicje prefiksów przestrzeni nazw, dodaje odnalezione definicje prefiksów przestrzeni nazw do element prefixes list, opcjonalnie ustawia wartość duplicate prefix definition, i zwraca wartość lokalnej domyślnej przestrzeni nazw zdefiniowanej przez atrybut domyślnej przestrzeni nazw (jeśli taki istnieje). W przeciwnym razie zwrócona zostanie wartość
null
.- Niech inherited ns będzie kopią namespace.
- Niech ns będzie wartością atrybutu
namespaceURI
w node. Jeśli inherited ns jest równe ns to:
- Jeśli local default namespace nie jest wartością
null
to ustaw flagę ignore namespace definition attribute na boolowską wartośćtrue
. - Jeśli ns jest przestrzenią nazw XML to niech qualified name będzie połączeniem łańcucha znakowego "
xml:
" i wartości atrybutulocalName
w node. W przeciwnym razie niech qualified name będzie wartością atrybutu
localName
w node.Prefiks w node jest zawsze odrzucany.
- Dodaj wartość qualified name do markup.
- Jeśli local default namespace nie jest wartością
W przeciwnym razie inherited ns nie jest równe ns (własna przestrzeń nazw w node różni się od przestrzeni nazw kontekstu jego rodzica). Wykonaj poniższe podkroki:
- Niech prefix będzie wartością atrybutu
prefix
w node. - Niech candidate prefix będzie wartością z map, gdzie istnieje klucz w map, który pasuje do wartości ns, a jeśli nie ma takiego klucza to niech candidate prefix będzie wartością
null
. Jeśli candidate prefix nie jest wartością
null
(odpowiedni prefiks przestrzeni nazw jest zdefiniowany i odwzorowuje się w ns) to:Niech qualified name będzie połączeniem candidate prefix, "
:
" (U+003A COLON
) i wartości atrybutulocalName
w node.Na node lub przodkach node istnieje definicja prefiksu przestrzeni nazw, która określa przestrzeń nazw node.
- Jeśli local default namespace nie jest wartością
null
(istnieje lokalnie definiujący atrybut deklaracji przestrzeni nazw), to niech inherited ns będzie wartością ns. - Dodaj wartość qualified name do markup.
W przeciwnym razie, jeśli prefix nie jest wartością
null
i local default namespace jest wartościąnull
, to:- Jeśli element prefixes list zawiera wartość prefix to niech prefix będzie wynikiem generowania prefiksu z przekazaniem mapy prefiksu przestrzeni nazw map, łańcucha znakowego ns i liczby całkowitej prefix index.
- W przeciwnym razie dodaj do map nowy klucz ns, którego wartość to prefix.
- Niech qualified name będzie połączeniem prefix, "
:
" (U+003A COLON
) i wartości atrybutulocalName
w node. - Dodaj wartość qualified name do markup.
Dodaj poniższe do markup zgodnie z podaną kolejnością:
Serializuje to nowe skojarzenia przestrzeni nazw/prefiksu dodane do map.
- "
U+0020 SPACE
); - Łańcuch znakowy "
xmlns:
"; - Wartość prefix;
- "
="
" (U+003D EQUALS SIGN
,U+0022 QUOTATION MARK
); - Wynik serializacji wartości atrybutu z przekazaniem ns i flagi require well-formed;
- "
"
" (U+0022 QUOTATION MARK
).
- "
W przeciwnym razie, jeśli local default namespace jest wartością
null
lub local default namespace nie jest wartościąnull
i jej wartość nie jest równa z ns, to:- Ustaw flagę ignore namespace definition attribute na boolowską wartość
true
. - Niech qualified name będzie wartością atrybutu
localName
w node. Niech wartością inherited ns będzie ns.
Nowa domyślna przestrzeń nazw będzie użyta w serializacji do zdefiniowania przestrzeni nazw tego węzła i działać jak przestrzeń nazw kontekstu dla jego dzieci.
- Dodaj wartość qualified name do markup.
Dodaj poniższe do markup zgodnie z podaną kolejnością:
Serializuje to nową (lub zamienianą) definicję domyślnej przestrzeni nazw.
- "
U+0020 SPACE
); - Łańcuch znakowy "
xmlns
"; - "
="
" (U+003D EQUALS SIGN
,U+0022 QUOTATION MARK
); - Wynik serializacji wartości atrybutu z przekazaniem ns i flagi require well-formed;
- "
"
" (U+0022 QUOTATION MARK
).
- "
- Ustaw flagę ignore namespace definition attribute na boolowską wartość
- W przeciwnym razie node ma local default namespace, która pasuje do ns. Niech qualified name będzie wartością atrybutu
localName
w node, niech wartością inherited ns będzie ns i dodaj wartość qualified name do markup.
- Niech prefix będzie wartością atrybutu
- Dodaj do markup wynik serializacji atrybutów XML dla node z przekazaniem mapy prefiksu przestrzeni nazw map, wygenerowanego indeksu prefiksu przestrzeni nazw prefix index, flagi ignore namespace definition attribute i wartości duplicate prefix definition.
Jeśli ns jest przestrzenią nazw HTML, a także lista dzieci w node jest pusta i wartość atrybutu
localName
w node pasuje do któregokolwiek z następujących elementów void: "area
", "base
", "basefont
", "bgsound
", "br
", "col
", "embed
", "frame
", "hr
", "img
", "input
", "keygen
", "link
", "menuitem
", "meta
", "param
", "source
", "track
", "wbr
", to dodaj poniższe do markup zgodnie z podaną kolejnością:- "
U+0020 SPACE
); - "
/
" (U+002F SOLIDUS
).
i ustaw flagę skip end tag na boolowską wartość
true
.- "
- Jeśli ns nie jest przestrzenią nazw HTML i lista dzieci w node jest pusta to dodaj "
/
" (U+002F SOLIDUS
) do markup i ustaw flagę skip end tag na boolowską wartośćtrue
. - Dodaj
">"
(U+003E GREATER-THAN SIGN
) do markup. - Jeśli wartością flagi skip end tag jest boolowska wartość
true
to zwróć wartość z markup i pomiń pozostałe kroki. Węzeł node jest traktowany jak węzeł-liść (leaf-node). Jeśli ns jest przestrzenią nazw HTML i wartość atrybutu
localName
w node pasuje do łańcucha znakowego "template
", to mamy do czynienia z elementemtemplate
. Dodaj do markup rezultat uruchomienia algorytmu serializacji XML na zawartości szablonu elementutemplate
(czyli skojarzonego z nim obiektu typuDocumentFragment
), z przekazaniem przestrzeni nazw kontekstu inherited ns, mapy prefiksu przestrzeni nazw map, wygenerowanego indeksu prefiksu przestrzeni nazw prefix index i flagi require well-formed.Pozwala to zawartości szablonu na wymienność między HTML a XML, z uwzględnieniem reguł parsowania dokumentów XHML definiowanych przez specyfikację HTML5.
- W przeciwnym razie dodaj do markup rezultat uruchomienia algorytmu serializacji XML na każdym dziecku w node, zgodnie z porządkiem drzewa, z przekazaniem przestrzeni nazw kontekstu inherited ns, mapy prefiksu przestrzeni nazw map, wygenerowanego indeksu prefiksu przestrzeni nazw prefix index i flagi require well-formed.
Dodaj poniższe do markup zgodnie z podaną kolejnością:
"</"
(U+003C LESS-THAN SIGN
,U+002F SOLIDUS
);- Wartość qualified name;
">"
(U+003E GREATER-THAN SIGN
).
Zwróć wartość markup.
- Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
- Dla węzła typu
Document
: - Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
true
) i node nie posiada elementu dokumentowego (tj. wartością atrybutudocumentElement
jestnull
), to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowanym dokumentem. W przeciwnym razie uruchom poniższe kroki:
- Niech serialized document będzie pustym łańcuchem znakowym.
- Dodaj do serialized document wynik serializacji DocumentType na obiekcie wskazywanym przez atrybut
doctype
w node z przekazaniem flagi require well-formed jeśli wartością atrybutudoctype
w node nie jestnull
. - Dla każdego (for each) dziecka child w node, zgodnie z porządkiem drzewa, uruchom algorytm serializacji XML na child z przekazaniem przestrzeni nazw kontekstu namespace, mapy prefiksu przestrzeni nazw prefix map, referencji do wygenerowanego indeksu prefiksu przestrzeni nazw prefix index, flagi require well-formed, i dodaj zwracany wynik do serialized document.
Zwróć wartość serialized document.
- Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
- Dla węzła typu
Comment
: - Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
true
) i wartość atrybutudata
w node zawiera znaki, które nie pasują do produkcjiChar
w XML, lub zawiera "--
" (dwa sąsiadujące znakiU+002D HYPHEN-MINUS
), lub kończy się znakiem "-
" (U+002D HYPHEN-MINUS
), to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowanym komentarzem. Zwróć połączenie
"<!--"
, wartości atrybutdata
w node oraz"-->"
.
- Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
- Dla węzła typu
Text
: - Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
true
) i wartość atrybutudata
w node zawiera znaki, które nie pasują do produkcjiChar
w XML, to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowanym węzłem tekstowym. - Niech markup będzie wartością atrybutu
data
w node. - Zastąp w markup każde wystąpienie znaku "
&
" znakami "&
". - Zastąp w markup każde wystąpienie znaku "
<
" znakami "<
". - Zastąp w markup każde wystąpienie znaku "
>
" znakami ">
". Zwróć wartość markup.
- Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
- Dla węzła typu
DocumentFragment
: - Niech markup będzie pustym łańcuchem znakowym.
- Dla każdego (for each) dziecka child w node, zgodnie z porządkiem drzewa, uruchom algorytm serializacji XML na child z przekazaniem przestrzeni nazw kontekstu namespace, mapy prefiksu przestrzeni nazw prefix map, referencji do wygenerowanego indeksu prefiksu przestrzeni nazw prefix index i flagi require well-formed. Połącz zwracane wyniki i umieść w markup.
Zwróć wartość markup.
- Dla węzła typu
DocumentType
: Zwróć wynik serializacji DocumentType na node z przekazaniem flagi require well-formed.
- Dla węzła typu
ProcessingInstruction
: - Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
true
) i wartość atrybututarget
w node zawiera znak ":
" (U+003A COLON
) lub pasuje do łańcucha znakowego "xml
" pod względem nieczułości na wielkość znaków ASCII, to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowaną instrukcją przetwarzania. - Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
true
) i wartość atrybutudata
w node zawiera znaki, które nie pasują do produkcjiChar
w XML, lub zawiera "?>
" (U+003F QUESTION MARK
,U+003E GREATER-THAN SIGN
), to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowaną instrukcją przetwarzania. Niech markup będzie połączeniem poniższych części zgodnie z podaną kolejnością:
- Zwróć wartość markup.
- Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
DocumentType serialization
Aby wyprodukować serializację DocumentType # (DocumentType serialization) węzła node z przekazaniem flagi wymaganego dobrego sformułowania require well-formed aplikacja kliencka musi wykonać następujące kroki:
- Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
true
) i wartość atrybutupublicId
w node zawiera znaki, które nie pasują do produkcjiPubidChar
w XML, to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowanym typem dokumentu. - Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość
true
) i wartość atrybutusystemId
w node zawiera znaki, które nie pasują do produkcjiChar
w XML, lub zawiera oba ""
" (U+0022 QUOTATION MARK
) i "'
" (U+0027 APOSTROPHE
), to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowanym typem dokumentu. - Niech markup będzie pustym łańcuchem znakowym.
- Dodaj łańcuch znakowy "
<!DOCTYPE
" do markup. - Dodaj "
U+0020 SPACE
) do markup. - Dodaj wartość atrybutu
name
w node do markup. Dla node należącego do dokumentu HTML cala wartość będzie wyrażana małymi literami. Jeśli wartość atrybutu
publicId
w node nie jest pustym łańcuchem znakowym to dodaj poniższe do markup zgodnie z podaną kolejnością:- "
U+0020 SPACE
); - Łańcuch znakowy "
PUBLIC
"; - "
U+0020 SPACE
); - "
"
" (U+0022 QUOTATION MARK
; - Wartość atrybutu
publicId
w node; - "
"
" (U+0022 QUOTATION MARK
).
- "
Jeśli wartość atrybutu
systemId
w node nie jest pustym łańcuchem znakowym i wartość atrybutupublicId
w node jest pustym łańcuchem znakowym to dodaj poniższe do markup zgodnie z podaną kolejnością:- "
U+0020 SPACE
); - Łańcuch znakowy "
SYSTEM
".
- "
Jeśli wartość atrybutu
systemId
w node nie jest pustym łańcuchem znakowym to dodaj poniższe do markup zgodnie z podaną kolejnością:- "
U+0020 SPACE
); - "
"
" (U+0022 QUOTATION MARK
; - Wartość atrybutu
systemId
w node; - "
"
" (U+0022 QUOTATION MARK
).
- "
- Dodaj "
>
" (U+003E GREATER-THAN SIGN
) do markup. - Zwróć wartość markup.
record the namespace information
Aby zapisać informacje przestrzeni nazw # (record the namespace information) elementu element z przekazaniem mapy prefiksu przestrzeni nazw map, listy prefiksów elementu element prefixes list (początkowo pustej) i referencji do powtórzonej definicji prefiksu duplicate prefix definition aplikacja kliencka musi wykonać następujące kroki:
- Niech default namespace attr value będzie wartością
null
. Główna #: Dla każdego (for each) atrybutu attr w liście atrybutów element, w kolejności, w jakiej są wymienione w liście atrybutów element:
Poniższe kroki warunkowe dodają prefiksy przestrzeni nazw do element prefixes list i dodają lub zastępują je w map. Tylko atrybuty w przestrzeni nazw XMLNS są rozważane (np. atrybuty wyglądające jak deklaracje przestrzeni nazw utworzone przy użyciu polecenia
setAttribute("xmlns:pretend-prefix", "pretend-namespace")
nie będą uwzględniane).- Niech attribute namespace będzie wartością atrybutu
namespaceURI
w attr. - Niech attribute prefix będzie wartością atrybutu
prefix
w attr. Jeśli attribute namespace jest przestrzenią nazw XMLNS to:
- Jeśli attribute prefix jest wartością
null
to attr jest deklaracją domyślnej przestrzeni nazw. Ustaw default namespace attr value na wartość atrybutuvalue
w attr i zatrzymaj dalsze kroki, powróć do (goto) Główna, aby przeanalizować kolejne atrybuty. W przeciwnym razie attribute prefix nie jest wartością
null
i attr jest definicją prefiksu przestrzeni nazw. Wykonaj poniższe podkroki:- Niech prefix definition będzie wartością atrybutu
localName
w attr. - Niech namespace definition będzie wartością atrybutu
value
w attr. - Jeśli dopasowanie klucza dla wartości namespace definition istnieje już w map i wartość klucza pasuje do prefix definition to jest to duplikacja definicji prefiksu przestrzeni nazw. Ustaw wartość duplicate prefix definition na prefix definition.
- W przeciwnym razie, jeśli dopasowanie klucza dla wartości namespace definition istnieje już w map, ale wartość klucza nie pasuje do prefix definition, to uaktualnij wartość klucza na prefix definition.
- W przeciwnym razie nie istnieje dopasowanie klucza dla wartości namespace definition; dodaj do map nowy klucz namespace definition, którego wartością będzie prefix definition.
- Dodaj wartość prefix definition do element prefixes list.
- Niech prefix definition będzie wartością atrybutu
- Jeśli attribute prefix jest wartością
- Niech attribute namespace będzie wartością atrybutu
- Zwróć wartość default namespace attr value.
generate a prefix
Aby wygenerować prefiks # (generate a prefix) z przekazaniem mapy prefiksu przestrzeni nazw map, łańcucha znakowego new namespace i referencji do wygenerowanego indeksu prefiksu przestrzeni nazw prefix index aplikacja kliencka musi wykonać następujące kroki:
- Niech generated prefix będzie połączeniem łańcucha znakowego "
ns
" i aktualnej wartości liczbowej prefix index. - Niech wartość prefix index zostanie zwiększona o jeden.
- Dodaj do map nowy klucz new namespace, którego wartością klucza jest generated prefix.
- Zwróć wartość generated prefix.
XML serialization of the attributes
Aby wyprodukować serializację atrybutów XML # (XML serialization of the attributes) na elemencie element z przekazaniem mapy prefiksu przestrzeni nazw map, referencji do wygenerowanego indeksu prefiksu przestrzeni nazw prefix index, flagi ignore namespace definition attribute, wartości duplicate prefix definition i flagi wymaganego dobrego sformułowania require well-formed flag aplikacja kliencka musi wykonać następujące kroki:
- Niech result będzie pustym łańcuchem znakowym.
Niech localname set będzie nowym pustym zestawem przestrzeni nazw dla nazw lokalnych # (namespace localname set). W localname set zawarte są krotki unikatowych par atrybutów
namespaceURI
orazlocalName
, i będzie on wypełniany przy przetwarzaniu każdego attr.Zestaw ten służy do (ewentualnego) egzekwowania wymogu dobrego sformułowania mówiącego że, element nie może mieć dwóch atrybutów z tymi samymi
namespaceURI
ilocalName
. Może to wystąpić, kiedy dwa identyczne atrybuty w tym samym elemencie różnią się jedynie wartościami prefiksów (szczegóły).Główna #: Dla każdego (for each) atrybutu attr w liście atrybutów element, w kolejności, w jakiej są wymienione w liście atrybutów element:
- Jeśli flaga require well-formed flag jest ustawiona (tj. ma boolowską wartość
true
) i localname set zawiera krotkę, której wartości pasują do nowej krotki zawierającej wartości atrybutównamespaceURI
orazlocalName
w attr, to zrzuć wyjątek; serializacja atrybutu nie wyprodukuje dobrze sformułowanego elementu. - Utwórz nową krotkę zawierającą wartości atrybutów
namespaceURI
orazlocalName
w attr i dodaj ją do localname set. - Niech attribute namespace będzie wartością atrybutu
namespaceURI
w attr. - Niech candidate prefix będzie wartością
null
. Jeśli attribute namespace nie jest wartością
null
to wykonaj poniższe podkroki:- Jeśli attribute namespace jest przestrzenią nazw XMLNS i jeśli albo wartością atrybutu prefix w attr jest
null
przy pozytywnej fladze ignore namespace definition attribute albo wartością atrybutu prefix w attr nie jest jestnull
i wartość atrybutulocalName
w attr pasuje do wartości duplicate prefix definition, to zatrzymaj dalsze kroki, powróć do (goto) Główna, aby przeanalizować kolejne atrybuty. - W przeciwnym razie, jeśli istnieje klucz w map, który pasuje do wartości attribute namespace, to niech candidate prefix będzie wartością klucza z map.
W przeciwnym razie nie istnieje klucz w map, który pasuje do attribute namespace i attribute namespace nie jest przestrzenią nazw XMLNS. Wykonaj poniższe podkroki:
- Niech candidate prefix będzie wynikiem generowania prefiksu z przekazaniem mapy prefiksu przestrzeni nazw map, łańcucha znakowego attribute namespace i liczby całkowitej prefix index.
Dodaj poniższe do result zgodnie z podaną kolejnością:
- "
U+0020 SPACE
); - Łańcuch znakowy "
xmlns:
"; - Wartość candidate prefix;
- "
="
" (U+003D EQUALS SIGN
,U+0022 QUOTATION MARK
); - Wynik serializacji wartości atrybutu z przekazaniem attribute namespace i flagi require well-formed flag;
- "
"
" (U+0022 QUOTATION MARK
).
- "
- Jeśli attribute namespace jest przestrzenią nazw XMLNS i jeśli albo wartością atrybutu prefix w attr jest
- Dodaj "
U+0020 SPACE
) do result. - Jeśli candidate prefix nie jest wartością
null
to dodaj do result połączenie candidate prefix i ":
" (U+003A COLON
). - Jeśli flaga require well-formed flag jest ustawiona (tj. ma boolowską wartość
true
) i wartość atrybutulocalName
w attr zawiera znak ":
" (U+003A COLON
), nie pasuje do produkcjiName
z XML lub jest równa łańcuchowi znakowemu "xmlns
" i attribute namespace jest wartościąnull
, to zrzuć wyjątek; serializacja attr nie będzie dobrze sformułowanym atrybutem. Dodaj poniższe do result zgodnie z podaną kolejnością:
- Wartość atrybutu
localName
w attr; - "
="
" (U+003D EQUALS SIGN
,U+0022 QUOTATION MARK
); - Wynik serializacji wartości atrybutu z przekazaniem wartości atrybutu
value
w attr i flagi require well-formed flag; - "
"
" (U+0022 QUOTATION MARK
).
- Wartość atrybutu
- Jeśli flaga require well-formed flag jest ustawiona (tj. ma boolowską wartość
- Zwróć wartość result.
serialize an attribute value
Aby zserializować wartość atrybutu # (serialize an attribute value) z przekazaniem wartości atrybutu attribute value i flagi wymaganego dobrego sformułowania require well-formed flag aplikacja kliencka musi wykonać następujące kroki:
- Jeśli flaga require well-formed flag jest ustawiona (tj. ma boolowską wartość
true
) i attribute value zawiera znaki, które nie pasują do produkcjiChar
w XML, to zrzuć wyjątek; serializacja atrybutu nie wyprodukuje dobrze sformułowanego elementu. - Jeśli attribute value jest wartością
null
to zwróć pusty łańcuch znakowy. W przeciwnym razie attribute value jest łańcuchem znakowym. Zwróć wartość attribute value, ale najpierw zastąp wszystkie poniższe wystąpienia:
- "
"
" przez ""
" - "
&
" przez "&
" - "
<
" przez "<
" - "
>
" przez ">
"
To pasuje do obecnego zachowania w przeglądarkach i wykracza poza wymogi gramatyczne stawiane dla produkcji
AttValue
w XML, bo dodatkowo zamienia znaki ">
".- "