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:

  1. 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.

  2. Niech new children będzie wynikiem działania algorithm z wejściem będącym markup oraz z elementem kontekstu w postaci context element.
  3. Niech fragment będzie nowym obiektem typu DocumentFragment, którego właścicielem jest właściciel w context element.
  4. 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.

  5. 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:

  1. Niech context document będzie właścicielem node.
  2. Jeśli context document jest dokumentem HTML, to wykonaj serializację HTML dla node.
  3. 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:

  1. 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:

  1. 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.
  2. 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.

  3. Zainicjuj mapę prefiksu przestrzeni nazw z kluczem będącym przestrzenią nazw XML i wartością klucza w postaci łańcucha znakowego "xml".
  4. 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.
  5. 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:

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:
  1. Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość true) i atrybut localName w node zawiera znak ":" (U+003A COLON) lub nie pasuje do produkcji Name z XML, to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowanym elementem.
  2. Niech markup będzie łańcuchem znakowym "<" (U+003C LESS-THAN SIGN).
  3. Niech qualified name będzie pustym łańcuchem znakowym.
  4. Niech flaga skip end tag ma boolowską wartość false.
  5. Niech flaga ignore namespace definition attribute ma boolowską wartość false.
  6. Niech map będzie kopią prefix map.
  7. 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.

  8. Niech duplicate prefix definition będzie wartością null.
  9. 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.

  10. Niech inherited ns będzie kopią namespace.
  11. Niech ns będzie wartością atrybutu namespaceURI w node.
  12. Jeśli inherited ns jest równe ns to:

    1. Jeśli local default namespace nie jest wartością null to ustaw flagę ignore namespace definition attribute na boolowską wartość true.
    2. Jeśli ns jest przestrzenią nazw XML to niech qualified name będzie połączeniem łańcucha znakowego "xml:" i wartości atrybutu localName w node.
    3. W przeciwnym razie niech qualified name będzie wartością atrybutu localName w node.

      Prefiks w node jest zawsze odrzucany.

    4. Dodaj wartość qualified name do markup.
  13. 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:

    1. Niech prefix będzie wartością atrybutu prefix w node.
    2. 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.
    3. Jeśli candidate prefix nie jest wartością null (odpowiedni prefiks przestrzeni nazw jest zdefiniowany i odwzorowuje się w ns) to:

      1. Niech qualified name będzie połączeniem candidate prefix, ":" (U+003A COLON) i wartości atrybutu localName w node.

        Na node lub przodkach node istnieje definicja prefiksu przestrzeni nazw, która określa przestrzeń nazw node.

      2. 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.
      3. Dodaj wartość qualified name do markup.
    4. W przeciwnym razie, jeśli prefix nie jest wartością null i local default namespace jest wartością null, to:

      1. 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.
      2. W przeciwnym razie dodaj do map nowy klucz ns, którego wartość to prefix.
      3. Niech qualified name będzie połączeniem prefix, ":" (U+003A COLON) i wartości atrybutu localName w node.
      4. Dodaj wartość qualified name do markup.
      5. Dodaj poniższe do markup zgodnie z podaną kolejnością:

        Serializuje to nowe skojarzenia przestrzeni nazw/prefiksu dodane do map.

        1. " " (U+0020 SPACE);
        2. Łańcuch znakowy "xmlns:";
        3. Wartość prefix;
        4. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
        5. Wynik serializacji wartości atrybutu z przekazaniem ns i flagi require well-formed;
        6. """ (U+0022 QUOTATION MARK).
    5. 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:

      1. Ustaw flagę ignore namespace definition attribute na boolowską wartość true.
      2. Niech qualified name będzie wartością atrybutu localName w node.
      3. 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.

      4. Dodaj wartość qualified name do markup.
      5. Dodaj poniższe do markup zgodnie z podaną kolejnością:

        Serializuje to nową (lub zamienianą) definicję domyślnej przestrzeni nazw.

        1. " " (U+0020 SPACE);
        2. Łańcuch znakowy "xmlns";
        3. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
        4. Wynik serializacji wartości atrybutu z przekazaniem ns i flagi require well-formed;
        5. """ (U+0022 QUOTATION MARK).
    6. 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.
  14. 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.
  15. 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ą:

    1. " " (U+0020 SPACE);
    2. "/" (U+002F SOLIDUS).

    i ustaw flagę skip end tag na boolowską wartość true.

  16. 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.
  17. Dodaj ">" (U+003E GREATER-THAN SIGN) do markup.
  18. 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).
  19. Jeśli ns jest przestrzenią nazw HTML i wartość atrybutu localName w node pasuje do łańcucha znakowego "template", to mamy do czynienia z elementem template. Dodaj do markup rezultat uruchomienia algorytmu serializacji XML na zawartości szablonu elementu template (czyli skojarzonego z nim obiektu typu DocumentFragment), 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.

  20. 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.
  21. Dodaj poniższe do markup zgodnie z podaną kolejnością:

    1. "</" (U+003C LESS-THAN SIGN, U+002F SOLIDUS);
    2. Wartość qualified name;
    3. ">" (U+003E GREATER-THAN SIGN).
  22. Zwróć wartość markup.

Dla węzła typu Document:
  1. Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość true) i node nie posiada elementu dokumentowego (tj. wartością atrybutu documentElement jest null), to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowanym dokumentem.
  2. W przeciwnym razie uruchom poniższe kroki:

    1. Niech serialized document będzie pustym łańcuchem znakowym.
    2. 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ą atrybutu doctype w node nie jest null.
    3. 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.
    4. Zwróć wartość serialized document.

Dla węzła typu Comment:
  1. Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość true) i wartość atrybutu data w node zawiera znaki, które nie pasują do produkcji Char w XML, lub zawiera "--" (dwa sąsiadujące znaki U+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.
  2. Zwróć połączenie "<!--", wartości atrybut data w node oraz "-->".

Dla węzła typu Text:
  1. Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość true) i wartość atrybutu data w node zawiera znaki, które nie pasują do produkcji Char w XML, to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowanym węzłem tekstowym.
  2. Niech markup będzie wartością atrybutu data w node.
  3. Zastąp w markup każde wystąpienie znaku "&" znakami "&amp;".
  4. Zastąp w markup każde wystąpienie znaku "<" znakami "&lt;".
  5. Zastąp w markup każde wystąpienie znaku ">" znakami "&gt;".
  6. Zwróć wartość markup.

Dla węzła typu DocumentFragment:
  1. Niech markup będzie pustym łańcuchem znakowym.
  2. 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.
  3. Zwróć wartość markup.

Dla węzła typu DocumentType:
  1. Zwróć wynik serializacji DocumentType na node z przekazaniem flagi require well-formed.

Dla węzła typu ProcessingInstruction:
  1. Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość true) i wartość atrybutu target 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.
  2. Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość true) i wartość atrybutu data w node zawiera znaki, które nie pasują do produkcji Char 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.
  3. Niech markup będzie połączeniem poniższych części zgodnie z podaną kolejnością:

    1. "<?" (U+003C LESS-THAN SIGN, U+003F QUESTION MARK);
    2. Wartości atrybutu target w node;
    3. " " (U+0020 SPACE);
    4. Wartości atrybutu data w node;
    5. "?>" (U+003F QUESTION MARK, U+003E GREATER-THAN SIGN).
  4. Zwróć wartość markup.

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:

  1. Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość true) i wartość atrybutu publicId w node zawiera znaki, które nie pasują do produkcji PubidChar w XML, to zrzuć wyjątek; serializacja node nie będzie dobrze sformułowanym typem dokumentu.
  2. Jeśli flaga require well-formed jest ustawiona (tj. ma boolowską wartość true) i wartość atrybutu systemId w node zawiera znaki, które nie pasują do produkcji Char 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.
  3. Niech markup będzie pustym łańcuchem znakowym.
  4. Dodaj łańcuch znakowy "<!DOCTYPE" do markup.
  5. Dodaj " " (U+0020 SPACE) do markup.
  6. Dodaj wartość atrybutu name w node do markup. Dla node należącego do dokumentu HTML cala wartość będzie wyrażana małymi literami.
  7. Jeśli wartość atrybutu publicId w node nie jest pustym łańcuchem znakowym to dodaj poniższe do markup zgodnie z podaną kolejnością:

    1. " " (U+0020 SPACE);
    2. Łańcuch znakowy "PUBLIC";
    3. " " (U+0020 SPACE);
    4. """ (U+0022 QUOTATION MARK;
    5. Wartość atrybutu publicId w node;
    6. """ (U+0022 QUOTATION MARK).
  8. Jeśli wartość atrybutu systemId w node nie jest pustym łańcuchem znakowym i wartość atrybutu publicId w node jest pustym łańcuchem znakowym to dodaj poniższe do markup zgodnie z podaną kolejnością:

    1. " " (U+0020 SPACE);
    2. Łańcuch znakowy "SYSTEM".
  9. Jeśli wartość atrybutu systemId w node nie jest pustym łańcuchem znakowym to dodaj poniższe do markup zgodnie z podaną kolejnością:

    1. " " (U+0020 SPACE);
    2. """ (U+0022 QUOTATION MARK;
    3. Wartość atrybutu systemId w node;
    4. """ (U+0022 QUOTATION MARK).
  10. Dodaj ">" (U+003E GREATER-THAN SIGN) do markup.
  11. 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:

  1. Niech default namespace attr value będzie wartością null.
  2. 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).

    1. Niech attribute namespace będzie wartością atrybutu namespaceURI w attr.
    2. Niech attribute prefix będzie wartością atrybutu prefix w attr.
    3. Jeśli attribute namespace jest przestrzenią nazw XMLNS to:

      1. Jeśli attribute prefix jest wartością null to attr jest deklaracją domyślnej przestrzeni nazw. Ustaw default namespace attr value na wartość atrybutu value w attr i zatrzymaj dalsze kroki, powróć do (goto) Główna, aby przeanalizować kolejne atrybuty.
      2. W przeciwnym razie attribute prefix nie jest wartością null i attr jest definicją prefiksu przestrzeni nazw. Wykonaj poniższe podkroki:

        1. Niech prefix definition będzie wartością atrybutu localName w attr.
        2. Niech namespace definition będzie wartością atrybutu value w attr.
        3. 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.
        4. 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.
        5. 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.
        6. Dodaj wartość prefix definition do element prefixes list.
  3. 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:

  1. Niech generated prefix będzie połączeniem łańcucha znakowego "ns" i aktualnej wartości liczbowej prefix index.
  2. Niech wartość prefix index zostanie zwiększona o jeden.
  3. Dodaj do map nowy klucz new namespace, którego wartością klucza jest generated prefix.
  4. 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:

  1. Niech result będzie pustym łańcuchem znakowym.
  2. 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 oraz localName, 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 i localName. Może to wystąpić, kiedy dwa identyczne atrybuty w tym samym elemencie różnią się jedynie wartościami prefiksów (szczegóły).

  3. 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:

    1. 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ów namespaceURI oraz localName w attr, to zrzuć wyjątek; serializacja atrybutu nie wyprodukuje dobrze sformułowanego elementu.
    2. Utwórz nową krotkę zawierającą wartości atrybutów namespaceURI oraz localName w attr i dodaj ją do localname set.
    3. Niech attribute namespace będzie wartością atrybutu namespaceURI w attr.
    4. Niech candidate prefix będzie wartością null.
    5. Jeśli attribute namespace nie jest wartością null to wykonaj poniższe podkroki:

      1. 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 jest null i wartość atrybutu localName w attr pasuje do wartości duplicate prefix definition, to zatrzymaj dalsze kroki, powróć do (goto) Główna, aby przeanalizować kolejne atrybuty.
      2. 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.
      3. 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:

        1. 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.
        2. Dodaj poniższe do result zgodnie z podaną kolejnością:

          1. " " (U+0020 SPACE);
          2. Łańcuch znakowy "xmlns:";
          3. Wartość candidate prefix;
          4. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
          5. Wynik serializacji wartości atrybutu z przekazaniem attribute namespace i flagi require well-formed flag;
          6. """ (U+0022 QUOTATION MARK).
    6. Dodaj " " (U+0020 SPACE) do result.
    7. Jeśli candidate prefix nie jest wartością null to dodaj do result połączenie candidate prefix i ":" (U+003A COLON).
    8. Jeśli flaga require well-formed flag jest ustawiona (tj. ma boolowską wartość true) i wartość atrybutu localName w attr zawiera znak ":" (U+003A COLON), nie pasuje do produkcji Name 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.
    9. Dodaj poniższe do result zgodnie z podaną kolejnością:

      1. Wartość atrybutu localName w attr;
      2. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
      3. Wynik serializacji wartości atrybutu z przekazaniem wartości atrybutu value w attr i flagi require well-formed flag;
      4. """ (U+0022 QUOTATION MARK).
  4. 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:

  1. Jeśli flaga require well-formed flag jest ustawiona (tj. ma boolowską wartość true) i attribute value zawiera znaki, które nie pasują do produkcji Char w XML, to zrzuć wyjątek; serializacja atrybutu nie wyprodukuje dobrze sformułowanego elementu.
  2. Jeśli attribute value jest wartością null to zwróć pusty łańcuch znakowy.
  3. W przeciwnym razie attribute value jest łańcuchem znakowym. Zwróć wartość attribute value, ale najpierw zastąp wszystkie poniższe wystąpienia:

    1. """ przez "&quot;"
    2. "&" przez "&amp;"
    3. "<" przez "&lt;"
    4. ">" przez "&gt;"

    To pasuje do obecnego zachowania w przeglądarkach i wykracza poza wymogi gramatyczne stawiane dla produkcji AttValue w XML, bo dodatkowo zamienia znaki ">".

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Ogólne (H1) Parsing & Serialization (H2) Algorytmy (H3) fragment parsing algorithm (H4) fragment serializing algorithm (H4) HTML serialization (H4) XML serialization (H4) XML serialization algorithm (H4) DocumentType serialization (H4) record the namespace information (H4) generate a prefix (H4) XML serialization of the attributes (H4) serialize an attribute value (H4)