{"id":20963,"date":"2026-10-01T18:14:12","date_gmt":"2026-10-01T16:14:12","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/sitemap-checker-validator-schema-hreflang-image-video-news\/"},"modified":"2026-10-01T18:29:23","modified_gmt":"2026-10-01T16:29:23","slug":"sitemap-checker-validator-schema-hreflang-image-video-news","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/sitemap-checker-validator-schema-hreflang-image-video-news\/","title":{"rendered":"Sitemap Checker &#038; Validator: schemat, hreflang oraz rozszerzenia dla obraz\u00f3w, wideo i news\u00f3w"},"content":{"rendered":"<div class=\"lw-sv\" id=\"sv-wurzel\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<style>\n.lw-sv label.sv-feld { display: flex; flex-direction: column; gap: 6px; font-size: 0.84rem; color: var(--text-secondary, #a0a0b0); margin-bottom: 12px; }\n.lw-sv textarea, .lw-sv input[type=url] { width: 100%; box-sizing: border-box; padding: 9px 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; font-size: 0.86rem; }\n.lw-sv textarea { min-height: 220px; resize: vertical; line-height: 1.45; }\n.lw-sv .sv-reihe { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 4px 0 6px; }\n.lw-sv button { padding: 9px 16px; border-radius: 6px; border: 1px solid var(--border, #2a2a35); background: var(--bg-body, #14141a); color: var(--text-primary, #e8e8ee); font-size: 0.92rem; cursor: pointer; }\n.lw-sv button.sv-haupt { background: var(--accent, #38bdf8); border-color: var(--accent, #38bdf8); color: var(--on-accent, #0a0e14); font-weight: 700; }\n.lw-sv button:focus-visible, .lw-sv input:focus-visible, .lw-sv textarea:focus-visible { outline: 2px solid var(--accent, #38bdf8); outline-offset: 2px; }\n.lw-sv .sv-datei { font-size: 0.86rem; color: var(--text-secondary, #a0a0b0); max-width: 100%; }\n.lw-sv .sv-status { min-height: 1.3em; margin: 10px 0 0; font-size: 0.92rem; color: var(--text-secondary, #a0a0b0); }\n.lw-sv .sv-status.sv-schlecht { color: var(--fail, #ff7b72); }\n.lw-sv .sv-h { font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.98rem; margin: 26px 0 8px; }\n.lw-sv .sv-tabelle { overflow-x: auto; }\n.lw-sv table { border-collapse: collapse; width: 100%; font-size: 0.88rem; }\n.lw-sv th, .lw-sv td { text-align: left; padding: 6px 10px; border-bottom: 1px solid var(--border, #2a2a35); vertical-align: top; color: var(--text-primary, #e8e8ee); }\n.lw-sv td:first-child { color: var(--text-secondary, #a0a0b0); white-space: nowrap; width: 38%; }\n.lw-sv td.sv-wert { font-family: monospace; word-break: break-all; }\n.lw-sv ul.sv-liste { list-style: none; margin: 0; padding: 0; }\n.lw-sv ul.sv-liste li { display: flex; gap: 10px; align-items: flex-start; padding: 9px 0; border-bottom: 1px solid var(--border, #2a2a35); font-size: 0.9rem; line-height: 1.5; color: var(--text-primary, #e8e8ee); }\n.lw-sv .sv-marke { flex: 0 0 auto; min-width: 74px; text-align: center; font-size: 0.74rem; font-weight: 700; padding: 2px 6px; border-radius: 4px; border: 1px solid currentColor; }\n.lw-sv .sv-fehler { color: var(--fail, #ff7b72); }\n.lw-sv .sv-warnung { color: var(--warn, #f0b429); }\n.lw-sv .sv-hinweis { color: var(--text-secondary, #a0a0b0); }\n.lw-sv .sv-gut { color: var(--pass, #3fb950); }\n.lw-sv .sv-zeilen { display: block; font-size: 0.8rem; color: var(--text-secondary, #a0a0b0); font-family: monospace; word-break: break-all; }\n.lw-sv .sv-klein { font-size: 0.84rem; color: var(--text-secondary, #a0a0b0); line-height: 1.55; margin: 0 0 6px; }\n.lw-sv .sv-klein a { color: var(--accent, #38bdf8); }\n@media (max-width: 480px) {\n    .lw-sv { padding: 16px !important; }\n    .lw-sv td:first-child { white-space: normal; }\n    .lw-sv .sv-marke { min-width: 62px; }\n}\n<\/style>\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 18px;\">Map\u0119 witryny mo\u017cna sprawdzi\u0107 przed publikacj\u0105, zanim trafi gdziekolwiek do sieci. Walidator czyta w przegl\u0105darce wklejony XML albo plik (tak\u017ce .gz) i sprawdza go wzgl\u0119dem protoko\u0142u sitemaps.org oraz rozszerze\u0144 Google dla hreflang, obraz\u00f3w, wideo i news\u00f3w. Ka\u017cde zg\u0142oszenie podaje numer wiersza. Nic nie jest wysy\u0142ane na serwer.<\/p>\n<p>    <label class=\"sv-feld\">XML mapy witryny (wklejony albo z pliku)<br \/>\n        <textarea id=\"sv-xml\" spellcheck=\"false\" autocomplete=\"off\" data-mp-mask placeholder=\"&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\"><\/textarea><br \/>\n    <\/label><\/p>\n<div class=\"sv-reihe\">\n        <input id=\"sv-datei\" class=\"sv-datei\" type=\"file\" accept=\".xml,.gz,.txt,application\/xml,text\/xml,application\/gzip\">\n    <\/div>\n<p>    <label class=\"sv-feld\" style=\"margin-top: 10px;\">Adres pliku (opcjonalnie, dla regu\u0142y lokalizacji z sitemaps.org)<br \/>\n        <input id=\"sv-adresse\" type=\"url\" inputmode=\"url\" autocomplete=\"off\" data-mp-mask placeholder=\"https:\/\/example.com\/sitemap.xml\"><br \/>\n    <\/label><\/p>\n<div class=\"sv-reihe\">\n        <button type=\"button\" id=\"sv-los\" class=\"sv-haupt\">Sprawdzenie<\/button><br \/>\n        <button type=\"button\" id=\"sv-beispiel\">Przyk\u0142ad z b\u0142\u0119dami<\/button><br \/>\n        <button type=\"button\" id=\"sv-leeren\">Czyszczenie<\/button>\n    <\/div>\n<p id=\"sv-status\" class=\"sv-status\" data-mp-mask aria-live=\"polite\">\n<div id=\"sv-ergebnis\" data-mp-mask hidden>\n<div class=\"sv-h\">Przegl\u0105d<\/div>\n<div class=\"sv-tabelle\">\n<table>\n<tbody id=\"sv-zahlen\" data-mp-mask><\/tbody>\n<\/table>\n<\/div>\n<div class=\"sv-h\">Wyniki<\/div>\n<ul id=\"sv-befunde\" class=\"sv-liste\" data-mp-mask><\/ul>\n<\/p><\/div>\n<div class=\"sv-h\">Co jest sprawdzane<\/div>\n<p class=\"sv-klein\">XML: poprawno\u015b\u0107 sk\u0142adni z wierszem i kolumn\u0105 (niezamaskowane &amp;, niezamkni\u0119te lub \u017ale zagnie\u017cd\u017cone tagi, nieznane encje, niezadeklarowane prefiksy), kodowanie UTF-8, najwy\u017cej 50 000 wpis\u00f3w i 50 MB bez kompresji.<\/p>\n<p class=\"sv-klein\">Protok\u00f3\u0142: element g\u0142\u00f3wny urlset albo sitemapindex w przestrzeni nazw http:\/\/www.sitemaps.org\/schemas\/sitemap\/0.9, dok\u0142adnie jeden loc na wpis jako pe\u0142ny, zakodowany adres kr\u00f3tszy ni\u017c 2048 znak\u00f3w, lastmod w formacie W3C, changefreq i priority z dozwolonymi warto\u015bciami, kolejno\u015b\u0107 wed\u0142ug XSD, duplikaty, mieszane hosty.<\/p>\n<p class=\"sv-klein\">hreflang: rel=&quot;alternate&quot;, kod j\u0119zyka wed\u0142ug ISO 639-1 z opcjonalnym regionem wed\u0142ug ISO 3166-1 (es-419 ani en-UK Google nie przyjmuje), odwo\u0142anie do samej siebie w ka\u017cdej grupie i odno\u015bniki zwrotne mi\u0119dzy wpisami pliku.<\/p>\n<p class=\"sv-klein\">Obrazy, wideo, newsy: image:loc, najwy\u017cej 1000 obraz\u00f3w na adres i tagi obraz\u00f3w usuni\u0119te w 2022 roku; pola obowi\u0105zkowe wideo, czas trwania od 1 do 28 800 s, ocena od 0 do 5, pola yes\/no i wycofane tagi; dla news\u00f3w publikacja, j\u0119zyk, data, tytu\u0142, najwy\u017cej 1000 wpis\u00f3w i limit wieku dw\u00f3ch dni.<\/p>\n<p class=\"sv-klein\">Z adresem pliku: regu\u0142a lokalizacji z sitemaps.org (tylko adresy poni\u017cej folderu pliku, ten sam schemat, ten sam host). Google uwzgl\u0119dnia wi\u0119cej, gdy mapa jest zg\u0142oszona w Search Console, dlatego naruszenie pojawia si\u0119 jako uwaga. Tego, co adresy odpowiadaj\u0105 na \u017cywo, walidator nie sprawdza.<\/p>\n<div class=\"sv-h\">Powi\u0105zane<\/div>\n<p class=\"sv-klein\">Jak dwadzie\u015bcia du\u017cych witryn dzieli swoje mapy i jakie naruszenia w nich tkwi\u0105, mierzy artyku\u0142 \u201e<a href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/struktury-map-witryn-24-strony-indeksy-podzial-rozszerzenia-naruszenia\/\">Struktury map witryn zmierzone na 24 stronach<\/a>\u201d.<\/p>\n<p class=\"sv-klein\">Opublikowan\u0105 map\u0119 witryny wraz z indeksem, plikami podrz\u0119dnymi i pr\u00f3bk\u0105 adres\u00f3w sprawdza <a href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/xml-sitemap-auditor-lastmod-index-sample-check\/\">audytor map witryn XML<\/a>.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Map\u0119 witryny mo\u017cna sprawdzi\u0107 przed publikacj\u0105, zanim trafi gdziekolwiek do sieci. Walidator czyta w przegl\u0105darce wklejony XML albo plik (tak\u017ce .gz) i sprawdza go wzgl\u0119dem protoko\u0142u sitemaps.org oraz rozszerze\u0144 Google dla hreflang, obraz\u00f3w, wideo i news\u00f3w. Ka\u017cde zg\u0142oszenie podaje numer wiersza. Nic nie jest wysy\u0142ane na serwer.\",\"f_xml\":\"XML mapy witryny (wklejony albo z pliku)\",\"f_adresse\":\"Adres pliku (opcjonalnie, dla regu\u0142y lokalizacji z sitemaps.org)\",\"k_pruefen\":\"Sprawdzenie\",\"k_beispiel\":\"Przyk\u0142ad z b\u0142\u0119dami\",\"k_leeren\":\"Czyszczenie\",\"h_ueberblick\":\"Przegl\u0105d\",\"h_befunde\":\"Wyniki\",\"h_regeln\":\"Co jest sprawdzane\",\"regel_1\":\"XML: poprawno\u015b\u0107 sk\u0142adni z wierszem i kolumn\u0105 (niezamaskowane \\u0026, niezamkni\u0119te lub \u017ale zagnie\u017cd\u017cone tagi, nieznane encje, niezadeklarowane prefiksy), kodowanie UTF-8, najwy\u017cej 50 000 wpis\u00f3w i 50 MB bez kompresji.\",\"regel_2\":\"Protok\u00f3\u0142: element g\u0142\u00f3wny urlset albo sitemapindex w przestrzeni nazw http:\\\/\\\/www.sitemaps.org\\\/schemas\\\/sitemap\\\/0.9, dok\u0142adnie jeden loc na wpis jako pe\u0142ny, zakodowany adres kr\u00f3tszy ni\u017c 2048 znak\u00f3w, lastmod w formacie W3C, changefreq i priority z dozwolonymi warto\u015bciami, kolejno\u015b\u0107 wed\u0142ug XSD, duplikaty, mieszane hosty.\",\"regel_3\":\"hreflang: rel=\\u0022alternate\\u0022, kod j\u0119zyka wed\u0142ug ISO 639-1 z opcjonalnym regionem wed\u0142ug ISO 3166-1 (es-419 ani en-UK Google nie przyjmuje), odwo\u0142anie do samej siebie w ka\u017cdej grupie i odno\u015bniki zwrotne mi\u0119dzy wpisami pliku.\",\"regel_4\":\"Obrazy, wideo, newsy: image:loc, najwy\u017cej 1000 obraz\u00f3w na adres i tagi obraz\u00f3w usuni\u0119te w 2022 roku; pola obowi\u0105zkowe wideo, czas trwania od 1 do 28 800 s, ocena od 0 do 5, pola yes\\\/no i wycofane tagi; dla news\u00f3w publikacja, j\u0119zyk, data, tytu\u0142, najwy\u017cej 1000 wpis\u00f3w i limit wieku dw\u00f3ch dni.\",\"regel_5\":\"Z adresem pliku: regu\u0142a lokalizacji z sitemaps.org (tylko adresy poni\u017cej folderu pliku, ten sam schemat, ten sam host). Google uwzgl\u0119dnia wi\u0119cej, gdy mapa jest zg\u0142oszona w Search Console, dlatego naruszenie pojawia si\u0119 jako uwaga. Tego, co adresy odpowiadaj\u0105 na \u017cywo, walidator nie sprawdza.\",\"h_artikel\":\"Powi\u0105zane\",\"art_vor\":\"Jak dwadzie\u015bcia du\u017cych witryn dzieli swoje mapy i jakie naruszenia w nich tkwi\u0105, mierzy artyku\u0142 \u201e\",\"art_titel\":\"Struktury map witryn zmierzone na 24 stronach\",\"art_nach\":\"\u201d.\",\"auditor_vor\":\"Opublikowan\u0105 map\u0119 witryny wraz z indeksem, plikami podrz\u0119dnymi i pr\u00f3bk\u0105 adres\u00f3w sprawdza \",\"auditor_href\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/xml-sitemap-auditor-lastmod-index-sample-check\\\/\",\"auditor_titel\":\"audytor map witryn XML\",\"auditor_nach\":\".\",\"s_leer\":\"Nie wklejono \u017cadnego XML.\",\"s_lese\":\"Odczyt pliku \u2026\",\"s_pruefe\":\"Du\u017cy plik, trwa sprawdzanie \u2026\",\"s_zu_gross\":\"Plik jest wi\u0119kszy ni\u017c 60 MB i nie zostanie odczytany. Limit wynosi 50 MB.\",\"s_utf8\":\"Plik nie jest poprawnym UTF-8. Protok\u00f3\u0142 wymaga UTF-8.\",\"s_lesefehler\":\"Nie uda\u0142o si\u0119 odczyta\u0107 ani rozpakowa\u0107 pliku.\",\"s_datei\":\"Odczytano: {name}, {kb} KB.\",\"s_datei_gz\":\"Odczytano i rozpakowano: {name}, {kb} KB bez kompresji.\",\"s_beispiel\":\"Wczytano przyk\u0142ad: cztery wpisy z siedmioma wbudowanymi b\u0142\u0119dami.\",\"z_art\":\"Rodzaj\",\"art_index\":\"Indeks map witryny (sitemapindex)\",\"art_urlset\":\"Mapa witryny (urlset)\",\"z_sitemaps\":\"Mapy podrz\u0119dne\",\"z_eintraege\":\"Wpisy\",\"z_groesse\":\"Rozmiar\",\"groesse_wert\":\"{kb} KB, {anteil} % limitu 50 MB\",\"z_hosts\":\"Hosty\",\"z_lastmod\":\"lastmod\",\"lastmod_wert\":\"{mit} z {n} z poprawn\u0105 dat\u0105, {verschieden} r\u00f3\u017cnych warto\u015bci\",\"z_erweiterungen\":\"Rozszerzenia\",\"erw_wert\":\"{hreflang} odno\u015bnik\u00f3w hreflang, {bilder} obraz\u00f3w, {videos} wideo, {news} news\u00f3w\",\"z_urteil\":\"Wynik\",\"urteil_fehler\":\"b\u0142\u0119dy: {fehler}, ostrze\u017cenia: {warnung}, uwagi: {hinweis}\",\"urteil_warnung\":\"bez b\u0142\u0119d\u00f3w, ostrze\u017cenia: {warnung}, uwagi: {hinweis}\",\"urteil_gut\":\"bez b\u0142\u0119d\u00f3w i bez ostrze\u017ce\u0144, uwagi: {hinweis}\",\"stufe_fehler\":\"B\u0142\u0105d\",\"stufe_warnung\":\"Ostrze\u017cenie\",\"stufe_hinweis\":\"Uwaga\",\"stufe_gut\":\"W porz\u0105dku\",\"zeilen_eine\":\"Wiersz {liste}\",\"zeilen_mehr\":\"{n} razy, wiersze {liste}\",\"anzahl\":\"{n} razy\",\"dezimal\":\",\",\"tausender\":\" \",\"b_leer\":\"Pole jest puste.\",\"b_xml_kaputt\":\"To nie jest poprawny sk\u0142adniowo XML: {grund} (wiersz {zeile}, kolumna {spalte}). Parser XML zatrzymuje si\u0119 w tym miejscu, a crawlery odrzucaj\u0105 plik.\",\"xml_ampersand\":\"znak \\u0026 bez encji; w adresach musi wyst\u0119powa\u0107 jako \\u0026amp;\",\"xml_zeichenref\":\"odwo\u0142anie {wert} nie oznacza znaku dozwolonego w XML\",\"xml_entitaet\":\"encja \\u0026{name}; nie jest zdefiniowana w XML; dozwolone s\u0105 tylko \\u0026amp; \\u0026lt; \\u0026gt; \\u0026quot; \\u0026apos; i odwo\u0142ania liczbowe\",\"xml_zeichen\":\"znak steruj\u0105cy zabroniony w XML ({wert})\",\"xml_text_aussen\":\"tekst poza elementem g\u0142\u00f3wnym\",\"xml_pi_offen\":\"instrukcja przetwarzania \\u003C? bez ?\\u003E\",\"xml_decl_pos\":\"deklaracja XML \\u003C?xml \u2026?\\u003E nie stoi na samym pocz\u0105tku pliku; nawet jeden pusty wiersz przed ni\u0105 to b\u0142\u0105d\",\"xml_kommentar_offen\":\"komentarz \\u003C!-- bez --\\u003E\",\"xml_cdata_offen\":\"sekcja CDATA bez ]]\\u003E\",\"xml_doctype_pos\":\"deklaracja DOCTYPE po elemencie g\u0142\u00f3wnym\",\"xml_doctype_offen\":\"deklaracja DOCTYPE bez zako\u0144czenia\",\"xml_name\":\"znak \\u003C bez poprawnej nazwy tagu; znak \\u003C w tek\u015bcie musi wyst\u0119powa\u0107 jako \\u0026lt;\",\"xml_tag_offen\":\"tag \\u003C{name}\\u003E nie jest domkni\u0119ty\",\"xml_schliessend_ohne\":\"\\u003C\\\/{name}\\u003E zamyka element, kt\u00f3ry nigdy nie zosta\u0142 otwarty\",\"xml_tag_falsch\":\"\\u003C\\\/{gefunden}\\u003E zamyka \\u003C{erwartet}\\u003E z wiersza {zeile_offen}\",\"xml_zweite_wurzel\":\"drugi element g\u0142\u00f3wny; plik mo\u017ce mie\u0107 tylko jeden\",\"xml_attribut\":\"b\u0142\u0119dny atrybut w \\u003C{name}\\u003E\",\"xml_attr_quote\":\"warto\u015b\u0107 {name} nie jest uj\u0119ta w cudzys\u0142\u00f3w\",\"xml_lt_attr\":\"znak \\u003C w warto\u015bci {name}\",\"xml_attr_doppelt\":\"atrybut {name} wyst\u0119puje dwa razy w tym samym tagu\",\"xml_prefix_unbekannt\":\"prefiks {prefix} w \\u003C{name}\\u003E nie jest zadeklarowany; w elemencie g\u0142\u00f3wnym brakuje xmlns:{prefix}=\\u0022\u2026\\u0022\",\"xml_tag_offen_ende\":\"\\u003C{name}\\u003E nie zostaje zamkni\u0119ty do ko\u0144ca pliku; plik jest prawdopodobnie uci\u0119ty\",\"xml_keine_wurzel\":\"plik nie zawiera \u017cadnego elementu\",\"b_encoding\":\"Deklaracja XML podaje kodowanie {wert}. Protok\u00f3\u0142 wymaga UTF-8.\",\"b_doctype\":\"Plik zawiera deklaracj\u0119 DOCTYPE. Mapa witryny jej nie potrzebuje; \u017caden crawler nie zna zdefiniowanych w niej encji.\",\"b_zu_gross\":\"Plik ma {mb} MB. Limit wynosi 50 MB bez kompresji; reszta nie jest czytana.\",\"b_wurzel_falsch\":\"Element g\u0142\u00f3wny to \\u003C{name}\\u003E. Mapa witryny zaczyna si\u0119 od \\u003Curlset\\u003E, indeks od \\u003Csitemapindex\\u003E; strona HTML w tym miejscu to zwykle strona b\u0142\u0119du.\",\"b_wurzel_prefix\":\"Element g\u0142\u00f3wny ma prefiks ({name}). Jest to dozwolone przy w\u0142a\u015bciwej przestrzeni nazw, ale nietypowe.\",\"b_ns_falsch\":\"Przestrze\u0144 nazw to {ns} zamiast http:\\\/\\\/www.sitemaps.org\\\/schemas\\\/sitemap\\\/0.9. Przestrzenie nazw por\u00f3wnuje si\u0119 znak po znaku; https:\\\/\\\/ albo stara wersja Google 0.84 to inna przestrze\u0144.\",\"b_ns_fehlt\":\"W elemencie g\u0142\u00f3wnym brakuje xmlns=\\u0022http:\\\/\\\/www.sitemaps.org\\\/schemas\\\/sitemap\\\/0.9\\u0022.\",\"b_datei_adresse\":\"Adres pliku ({wert}) nie jest adresem http ani https; regu\u0142a lokalizacji nie zosta\u0142a sprawdzona.\",\"b_element_unbekannt\":\"\\u003C{name}\\u003E nie jest dozwolony w \\u003C{in}\\u003E. Indeks zawiera tylko \\u003Csitemap\\u003E, mapa tylko \\u003Curl\\u003E, a changefreq i priority wyst\u0119puj\u0105 wy\u0142\u0105cznie w \\u003Curl\\u003E.\",\"b_leer_liste\":\"Plik nie zawiera ani jednego wpisu.\",\"b_zu_viele\":\"Wpis\u00f3w: {n}. Limit wynosi 50 000 na plik; nadwy\u017cka nale\u017cy do kolejnych plik\u00f3w i indeksu.\",\"b_element_doppelt\":\"\\u003C{name}\\u003E wyst\u0119puje w jednym wpisie wi\u0119cej ni\u017c raz.\",\"b_reihenfolge\":\"Elementy podrz\u0119dne nie stoj\u0105 w kolejno\u015bci XSD (loc, lastmod, changefreq, priority, potem rozszerzenia). Google to nie przeszkadza, \u015bcis\u0142ej walidacji schematu ju\u017c tak.\",\"b_loc_fehlt\":\"Wpis nie ma \\u003Cloc\\u003E albo ma pusty.\",\"b_loc_leerraum\":\"W \\u003Cloc\\u003E wok\u00f3\u0142 adresu stoj\u0105 spacje lub znaki nowego wiersza.\",\"b_loc_relativ\":\"Adres wzgl\u0119dny {wert}. Wymagane s\u0105 pe\u0142ne adresy ze schematem i hostem.\",\"b_loc_schema\":\"Adres bez http ani https: {wert}.\",\"b_loc_lang\":\"Adres ma 2048 znak\u00f3w lub wi\u0119cej: {wert} \u2026\",\"b_loc_unkodiert\":\"Niezakodowane znaki w adresie (spacje, znaki diakrytyczne, cudzys\u0142owy): {wert}. Wymagane jest kodowanie procentowe.\",\"b_loc_fragment\":\"Adres zawiera fragment (#): {wert}. Crawlery go odcinaj\u0105, a wpis dubluje wtedy inny.\",\"b_ort_fremdhost\":\"Adres na innym ho\u015bcie ni\u017c plik ({host}): {wert}. Dzia\u0142a to tylko wtedy, gdy robots.txt tego hosta wskazuje na map\u0119.\",\"b_index_fremdhost\":\"Indeks wymienia map\u0119 na ho\u015bcie innym ni\u017c {host}: {wert}.\",\"b_ort_ausserhalb\":\"Adres poza {ordner}: {wert}. Wed\u0142ug sitemaps.org mapa obowi\u0105zuje tylko dla swojego folderu i ni\u017cszych; Google uwzgl\u0119dnia j\u0105 mimo to, gdy jest zg\u0142oszona w Search Console.\",\"b_index_ausserhalb\":\"Mapa podrz\u0119dna poza {ordner}: {wert}. Google wymaga map podrz\u0119dnych w folderze indeksu lub ni\u017cej.\",\"b_doppelt\":\"Zdublowany wpis: {wert}.\",\"b_lastmod_format\":\"lastmod \u201e{wert}\u201d nie jest dat\u0105 W3C. Poprawne s\u0105 np. 2026-10-01 lub 2026-10-01T14:05:00+02:00.\",\"b_lastmod_ohne_zone\":\"lastmod \u201e{wert}\u201d ma godzin\u0119 bez strefy czasowej. XSD to przyjmuje, format W3C wymaga Z albo przesuni\u0119cia, np. +02:00.\",\"b_lastmod_zukunft\":\"lastmod \u201e{wert}\u201d le\u017cy w przysz\u0142o\u015bci.\",\"b_changefreq_wert\":\"changefreq \u201e{wert}\u201d nie jest dozwolon\u0105 warto\u015bci\u0105 (always, hourly, daily, weekly, monthly, yearly, never).\",\"b_priority_wert\":\"priority \u201e{wert}\u201d nie mie\u015bci si\u0119 mi\u0119dzy 0.0 a 1.0.\",\"b_hreflang_rel\":\"xhtml:link z rel=\\u0022{wert}\\u0022 zamiast rel=\\u0022alternate\\u0022.\",\"b_hreflang_code\":\"hreflang \u201e{wert}\u201d nie jest poprawnym kodem. Najpierw j\u0119zyk wed\u0142ug ISO 639-1, potem opcjonalnie region wed\u0142ug ISO 3166-1, np. pl albo de-AT; es-419, en-UK ani samego regionu Google nie przyjmuje.\",\"b_hreflang_href\":\"xhtml:link bez pe\u0142nego adresu w href: {wert}.\",\"b_ext_platz\":\"\\u003C{name}\\u003E stoi bezpo\u015brednio w \\u003Curl\\u003E. Nale\u017cy do swojego elementu nadrz\u0119dnego (image:image, video:video albo news:news).\",\"b_bild_loc_fehlt\":\"image:image bez image:loc.\",\"b_bild_url\":\"image:loc nie jest pe\u0142nym adresem: {wert}.\",\"b_bild_veraltet\":\"Google usun\u0105\u0142 \\u003C{name}\\u003E z map obraz\u00f3w w 2022 roku; warto\u015b\u0107 nie jest ju\u017c czytana.\",\"b_ns_variante\":\"\\u003C{name}\\u003E nale\u017cy do przestrzeni nazw {ns}. Oczekiwana jest wersja http, np. http:\\\/\\\/www.google.com\\\/schemas\\\/sitemap-image\\\/1.1 albo http:\\\/\\\/www.w3.org\\\/1999\\\/xhtml; inny zapis to inna przestrze\u0144 nazw.\",\"b_bild_zu_viele\":\"{n} obraz\u00f3w przy jednym adresie. Google przyjmuje najwy\u017cej 1000 na url.\",\"b_hreflang_doppelt\":\"hreflang \u201e{wert}\u201d wyst\u0119puje w jednym wpisie dwa razy z r\u00f3\u017cnymi adresami.\",\"b_hreflang_selbst\":\"Grupa hreflang adresu {wert} nie wymienia samej strony. Google wymaga, by ka\u017cda wersja figurowa\u0142a na w\u0142asnej li\u015bcie.\",\"b_hreflang_rueck\":\"{von} wskazuje na {nach}, ale {nach} nie wskazuje z powrotem. Bez odno\u015bnika zwrotnego Google mo\u017ce odrzuci\u0107 adnotacj\u0119.\",\"b_hreflang_extern\":\"Cel\u00f3w hreflang spoza tego pliku: {n}; ich odno\u015bnik\u00f3w zwrotnych nie da si\u0119 tu sprawdzi\u0107.\",\"b_hreflang_ok\":\"hreflang w {n} wpisach: kody poprawne, odwo\u0142ania do siebie i odno\u015bniki zwrotne w obr\u0119bie pliku kompletne.\",\"b_news_zu_viele\":\"Wpis\u00f3w news: {n}. Google przyjmuje najwy\u017cej 1000 na map\u0119 news\u00f3w.\",\"b_host_gemischt\":\"Adresy na {n} hostach: {liste}. Mapa witryny powinna zawiera\u0107 adresy jednego hosta.\",\"b_schema_gemischt\":\"Pomieszane http i https: {http} z http, {https} z https.\",\"b_lastmod_fehlt\":\"\u017baden wpis nie ma lastmod. Pole jest dobrowolne, ale to jedyne pole formatu podstawowego, z kt\u00f3rego korzysta Google.\",\"b_lastmod_teil\":\"lastmod ma {mit} z {n} wpis\u00f3w.\",\"b_lastmod_gleich\":\"Wszystkie wpisy ({n}) maj\u0105 ten sam lastmod ({wert}). Taka data opisuje przebieg generatora, nie strony, a Google polega tylko na lastmod, kt\u00f3ry da si\u0119 zweryfikowa\u0107.\",\"b_prio_cf\":\"priority wyst\u0119puje w {priority}, changefreq w {changefreq} wpisach. Google ignoruje oba pola.\",\"b_fremd_ns\":\"Elementy z innych przestrzeni nazw: {liste}. Zosta\u0142y policzone, ale nie sprawdzone.\",\"b_sauber\":\"Bez b\u0142\u0119d\u00f3w i bez ostrze\u017ce\u0144 w {n} wpisach.\",\"b_video_pflicht\":\"Wideo bez pola obowi\u0105zkowego: {liste}.\",\"b_video_beschreibung\":\"video:description ma {n} znak\u00f3w; limit wynosi 2048.\",\"b_video_dauer\":\"video:duration \u201e{wert}\u201d nie jest liczb\u0105 ca\u0142kowit\u0105 od 1 do 28800 sekund.\",\"b_video_rating\":\"video:rating \u201e{wert}\u201d nie mie\u015bci si\u0119 mi\u0119dzy 0.0 a 5.0.\",\"b_video_datum\":\"{name} \u201e{wert}\u201d nie jest dat\u0105 W3C ze stref\u0105 czasow\u0105.\",\"b_video_janein\":\"{name} \u201e{wert}\u201d: dozwolone s\u0105 tylko yes i no, ma\u0142ymi literami.\",\"b_video_relationship\":\"{name} bez relationship=\\u0022allow\\u0022 albo \\u0022deny\\u0022.\",\"b_video_platform\":\"video:platform \u201e{wert}\u201d: dozwolone s\u0105 web, mobile i tv, rozdzielone spacjami.\",\"b_video_tags\":\"{n} element\u00f3w video:tag w jednym wideo; Google przyjmuje najwy\u017cej 32.\",\"b_video_uploader\":\"video:uploader ma {n} znak\u00f3w; limit wynosi 255.\",\"b_video_veraltet\":\"{name} jest wycofany i nie jest ju\u017c czytany.\",\"b_news_sprache\":\"news:language \u201e{wert}\u201d: wymagany jest kod ISO 639 z dw\u00f3ch lub trzech liter, wyj\u0105tki to tylko zh-cn i zh-tw.\",\"b_news_datum\":\"news:publication_date \u201e{wert}\u201d nie jest dat\u0105 W3C.\",\"b_news_alt\":\"news:publication_date {wert} jest starsza ni\u017c dwa dni. Mapa news\u00f3w powinna obejmowa\u0107 tylko artyku\u0142y z ostatnich dw\u00f3ch dni.\",\"b_news_pflicht\":\"news:news bez pola obowi\u0105zkowego: {liste}.\"};<\/p>\n<p>    \/\/ KERN-ANFANG\n    var NS_SM = 'http:\/\/www.sitemaps.org\/schemas\/sitemap\/0.9';\n    var NS_IMG = 'http:\/\/www.google.com\/schemas\/sitemap-image\/1.1';\n    var NS_VID = 'http:\/\/www.google.com\/schemas\/sitemap-video\/1.1';\n    var NS_NEWS = 'http:\/\/www.google.com\/schemas\/sitemap-news\/0.9';\n    var NS_XHTML = 'http:\/\/www.w3.org\/1999\/xhtml';\n    var MAX_EINTRAEGE = 50000, MAX_BYTES = 52428800, MAX_URL = 2048;\n    var STUFEN = ['fehler', 'warnung', 'hinweis', 'gut'];\n    var CHANGEFREQ = ['always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never'];<\/p>\n<p>    function utf8Laenge(s) {\n        var n = 0;\n        for (var i = 0; i < s.length; i++) {\n            var c = s.charCodeAt(i);\n            if (c < 0x80) { n += 1; } else if (c < 0x800) { n += 2; } else if (c >= 0xD800 && c <= 0xDBFF) { n += 4; i++; } else { n += 3; }\n        }\n        return n;\n    }\n\n    \/\/ Zeilenanfaenge einmal sammeln, Position per Halbierung\n    function zeilenIndex(s) {\n        var a = [0], i = -1;\n        while ((i = s.indexOf('\\n', i + 1)) !== -1) { a.push(i + 1); }\n        return a;\n    }\n    function position(index, off) {\n        var lo = 0, hi = index.length - 1;\n        while (lo < hi) { var m = (lo + hi + 1) >> 1; if (index[m] <= off) { lo = m; } else { hi = m - 1; } }\n        return { zeile: lo + 1, spalte: off - index[lo] + 1 };\n    }\n\n    \/\/ --- XML lesen: nicht validierend, aber streng bei Wohlgeformtheit ---------\n    var NAME_RE = \/[A-Za-z_\\u00C0-\\uFFFF][A-Za-z0-9_.\\-:\\u00B7\\u00C0-\\uFFFF]*\/y;\n    var ENT_RE = \/&#038;(#x[0-9a-fA-F]+|#[0-9]+|[A-Za-z_][A-Za-z0-9_.\\-]*)?(;)?\/g;\n    var VORDEF = { amp: '&#038;', lt: '<', gt: '>', quot: '\"', apos: \"'\" };<\/p>\n<p>    function xmlLesen(s) {\n        var i = 0, n = s.length, stapel = [], wurzel = null, decl = null, bom = false, doctype = false;\n        function halt(code, off, daten) { var e = new Error(code); e.xml = { code: code, off: off, daten: daten || {} }; throw e; }\n        function name(at) { NAME_RE.lastIndex = at; var m = NAME_RE.exec(s); return m ? m[0] : null; }\n        function entitaeten(str, basis) {\n            if (str.indexOf('&') === -1) { return str; }\n            ENT_RE.lastIndex = 0;\n            return str.replace(ENT_RE, function (alles, nm, semi, off) {\n                if (!nm || !semi) { halt('ampersand', basis + off); }\n                if (nm.charAt(0) === '#') {\n                    var cp = nm.charAt(1) === 'x' ? parseInt(nm.slice(2), 16) : parseInt(nm.slice(1), 10);\n                    if (!(cp === 9 || cp === 10 || cp === 13 || (cp >= 32 && cp <= 0xD7FF) || (cp >= 0xE000 && cp <= 0xFFFD) || (cp >= 0x10000 && cp <= 0x10FFFF))) { halt('zeichenref', basis + off, { wert: alles }); }\n                    return String.fromCodePoint(cp);\n                }\n                if (!Object.prototype.hasOwnProperty.call(VORDEF, nm)) { halt('entitaet', basis + off, { name: nm }); }\n                return VORDEF[nm];\n            });\n        }\n        try {\n            var steuer = \/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\uFFFE\\uFFFF]\/.exec(s);\n            if (steuer) { halt('zeichen', steuer.index, { wert: 'U+' + ('000' + steuer[0].charCodeAt(0).toString(16).toUpperCase()).slice(-4) }); }\n            if (s.charCodeAt(0) === 0xFEFF) { bom = true; i = 1; }\n            while (i < n) {\n                var lt = s.indexOf('<', i), ende = lt === -1 ? n : lt;\n                if (ende > i) {\n                    var stueck = s.slice(i, ende), oben = stapel[stapel.length - 1];\n                    if (!oben) { var nw = stueck.search(\/\\S\/); if (nw !== -1) { halt('text_aussen', i + nw); } }\n                    else if (\/\\S\/.test(stueck) || !oben.kinder.length) { oben.text += entitaeten(stueck, i); }\n                    i = ende;\n                    if (lt === -1) { break; }\n                }\n                if (s.startsWith('<?', i)) {\n                    var e1 = s.indexOf('?>', i + 2);\n                    if (e1 === -1) { halt('pi_offen', i); }\n                    var pi = s.slice(i + 2, e1);\n                    if (\/^xml(\\s|$)\/i.test(pi)) { if (i !== (bom ? 1 : 0)) { halt('decl_pos', i); } decl = pi; }\n                    i = e1 + 2; continue;\n                }\n                if (s.startsWith('<!--', i)) { var e2 = s.indexOf('-->', i + 4); if (e2 === -1) { halt('kommentar_offen', i); } i = e2 + 3; continue; }\n                if (s.startsWith('<![CDATA[', i)) {\n                    if (!stapel.length) { halt('text_aussen', i); }\n                    var e3 = s.indexOf(']]>', i + 9); if (e3 === -1) { halt('cdata_offen', i); }\n                    stapel[stapel.length - 1].text += s.slice(i + 9, e3); i = e3 + 3; continue;\n                }\n                if (s.startsWith('<!DOCTYPE', i)) {\n                    if (wurzel) { halt('doctype_pos', i); }\n                    doctype = true;\n                    var tiefe = 0, j0 = i + 9;\n                    for (; j0 < n; j0++) { var ch = s.charAt(j0); if (ch === '[') { tiefe++; } else if (ch === ']') { tiefe--; } else if (ch === '>' && tiefe <= 0) { break; } }\n                    if (j0 >= n) { halt('doctype_offen', i); }\n                    i = j0 + 1; continue;\n                }\n                if (s.charAt(i + 1) === '\/') {\n                    var zn = name(i + 2);\n                    if (!zn) { halt('name', i); }\n                    var j1 = i + 2 + zn.length;\n                    while (\/\\s\/.test(s.charAt(j1))) { j1++; }\n                    if (s.charAt(j1) !== '>') { halt('tag_offen', i, { name: zn }); }\n                    var offen = stapel.pop();\n                    if (!offen) { halt('schliessend_ohne', i, { name: zn }); }\n                    if (offen.name !== zn) { halt('tag_falsch', i, { gefunden: zn, erwartet: offen.name, off_offen: offen.off }); }\n                    i = j1 + 1; continue;\n                }\n                if (wurzel && !stapel.length) { halt('zweite_wurzel', i); }\n                var tn = name(i + 1);\n                if (!tn) { halt('name', i); }\n                var j = i + 1 + tn.length, attrs = {}, selbst = false;\n                for (;;) {\n                    var vor = j;\n                    while (\/\\s\/.test(s.charAt(j))) { j++; }\n                    var c = s.charAt(j);\n                    if (c === '>') { j++; break; }\n                    if (c === '\/' && s.charAt(j + 1) === '>') { selbst = true; j += 2; break; }\n                    if (j >= n) { halt('tag_offen', i, { name: tn }); }\n                    var an = name(j);\n                    if (!an || j === vor) { halt('attribut', j, { name: tn }); }\n                    j += an.length;\n                    while (\/\\s\/.test(s.charAt(j))) { j++; }\n                    if (s.charAt(j) !== '=') { halt('attribut', j, { name: tn }); }\n                    j++;\n                    while (\/\\s\/.test(s.charAt(j))) { j++; }\n                    var q = s.charAt(j);\n                    if (q !== '\"' && q !== \"'\") { halt('attr_quote', j, { name: an }); }\n                    var ae = s.indexOf(q, j + 1);\n                    if (ae === -1) { halt('tag_offen', i, { name: tn }); }\n                    var roh = s.slice(j + 1, ae);\n                    var ltA = roh.indexOf('<');\n                    if (ltA !== -1) { halt('lt_attr', j + 1 + ltA, { name: an }); }\n                    if (Object.prototype.hasOwnProperty.call(attrs, an)) { halt('attr_doppelt', j, { name: an }); }\n                    attrs[an] = entitaeten(roh, j + 1);\n                    j = ae + 1;\n                }\n                var eltern = stapel[stapel.length - 1] || null;\n                var nsmap = eltern ? eltern.nsmap : { xml: 'http:\/\/www.w3.org\/XML\/1998\/namespace' };\n                for (var a in attrs) {\n                    if (a === 'xmlns' || a.indexOf('xmlns:') === 0) {\n                        if (nsmap === (eltern &#038;&#038; eltern.nsmap)) { nsmap = Object.assign({}, nsmap); }\n                        nsmap[a === 'xmlns' ? '' : a.slice(6)] = attrs[a];\n                    }\n                }\n                var dp = tn.indexOf(':'), prefix = dp === -1 ? '' : tn.slice(0, dp), lokal = dp === -1 ? tn : tn.slice(dp + 1);\n                if (prefix &#038;&#038; nsmap[prefix] === undefined) { halt('prefix_unbekannt', i, { prefix: prefix, name: tn }); }\n                var knoten = { name: tn, prefix: prefix, lokal: lokal, ns: nsmap[prefix] || '', attrs: attrs, kinder: [], text: '', off: i, nsmap: nsmap };\n                if (eltern) { eltern.kinder.push(knoten); } else { wurzel = knoten; }\n                if (!selbst) { stapel.push(knoten); }\n                i = j;\n            }\n            if (stapel.length) { var o = stapel[stapel.length - 1]; halt('tag_offen_ende', o.off, { name: o.name }); }\n            if (!wurzel) { halt('keine_wurzel', 0); }\n        } catch (e) {\n            if (!e.xml) { throw e; }\n            return { wurzel: null, fehler: e.xml, decl: decl, bom: bom, doctype: doctype };\n        }\n        return { wurzel: wurzel, fehler: null, decl: decl, bom: bom, doctype: doctype };\n    }\n\n    \/\/ --- Feldpruefungen --------------------------------------------------------\n    var W3C_RE = \/^(\\d{4})-(\\d{2})-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$\/;\n    \/\/ 'ok', 'ohne_zone' (Uhrzeit ohne Zeitzone: XSD nimmt es, W3C Datetime nicht) oder 'falsch'\n    function datumArt(w) {\n        var m = W3C_RE.exec(w);\n        if (!m) { return 'falsch'; }\n        var jahr = +m[1], mon = +m[2], tag = +m[3];\n        if (mon < 1 || mon > 12 || tag < 1 || tag > new Date(Date.UTC(jahr, mon, 0)).getUTCDate()) { return 'falsch'; }\n        if (m[4] !== undefined) {\n            if (+m[4] > 23 || +m[5] > 59 || (m[6] !== undefined && +m[6] > 59)) { return 'falsch'; }\n            if (m[7] && m[7] !== 'Z') { var zh = +m[7].slice(1, 3), zm = +m[7].slice(4, 6); if (zh > 14 || zm > 59) { return 'falsch'; } }\n            if (m[7] === undefined) { return m[6] === undefined ? 'falsch' : 'ohne_zone'; }\n        }\n        return 'ok';\n    }\n    function datumMs(w) {\n        var m = W3C_RE.exec(w);\n        if (!m) { return NaN; }\n        var t = Date.UTC(+m[1], +m[2] - 1, +m[3], m[4] ? +m[4] : 0, m[5] ? +m[5] : 0, m[6] ? +m[6] : 0);\n        if (m[7] && m[7] !== 'Z') { var vz = m[7].charAt(0) === '-' ? -1 : 1; t -= vz * (+m[7].slice(1, 3) * 60 + +m[7].slice(4, 6)) * 60000; }\n        return t;\n    }\n    \/\/ Probleme einer Adresse; leer heisst sauber\n    function urlProbleme(u) {\n        var p = [];\n        if (!\/^[A-Za-z][A-Za-z0-9+.\\-]*:\/.test(u)) { p.push('relativ'); return p; }\n        if (!\/^https?:\\\/\\\/[^\\\/?#\\s]+\/i.test(u)) { p.push('schema'); return p; }\n        if (u.length >= MAX_URL) { p.push('lang'); }\n        if (\/[\\s\"<>{}|\\\\^`]|[^\\x00-\\x7F]\/.test(u)) { p.push('unkodiert'); }\n        if (u.indexOf('#') !== -1) { p.push('fragment'); }\n        return p;\n    }\n    function urlTeile(u) {\n        var m = \/^(https?):\\\/\\\/([^\\\/?#]+)([^?#]*)\/i.exec(u);\n        if (!m) { return null; }\n        var host = m[2].toLowerCase().replace(\/:(80|443)$\/, '');\n        return { schema: m[1].toLowerCase(), host: host, pfad: m[3] || '\/' };\n    }\n    function unterhalb(u, basis) {\n        var t = urlTeile(u);\n        if (!t || !basis) { return true; }\n        return t.schema === basis.schema && t.host === basis.host && t.pfad.indexOf(basis.ordner) === 0;\n    }\n    var HREFLANG_RE = \/^([a-z]{2})(-[a-z]{4})?(-([a-z]{2}))?$\/i;\n    function hreflangGueltig(c) {\n        if (\/^x-default$\/i.test(c)) { return true; }\n        var m = HREFLANG_RE.exec(c);\n        if (!m) { return false; }\n        if (m[4] && \/^(uk|eu)$\/i.test(m[4])) { return false; }\n        return true;\n    }\n    function kind(knoten, ns, lokal) {\n        for (var i = 0; i < knoten.kinder.length; i++) { var k = knoten.kinder[i]; if (k.ns === ns &#038;&#038; k.lokal === lokal) { return k; } }\n        return null;\n    }\n    function kinderVon(knoten, ns, lokal) {\n        return knoten.kinder.filter(function (k) { return k.ns === ns &#038;&#038; k.lokal === lokal; });\n    }\n    function textVon(k) { return k ? k.text.trim() : ''; }\n\n    \/\/ --- Pruefung --------------------------------------------------------------\n    function pruefen(s, opt) {\n        opt = opt || {};\n        var jetzt = typeof opt.jetzt === 'number' ? opt.jetzt : Date.now();\n        var sammel = {}, reihe = [];\n        function b(key, stufe, off, daten) {\n            var f = sammel[key];\n            if (!f) { f = sammel[key] = { key: key, stufe: stufe, n: 0, stellen: [], daten: daten || {} }; reihe.push(f); }\n            f.n++;\n            if (typeof off === 'number' &#038;&#038; f.stellen.length < 5) { f.stellen.push(off); }\n            return f;\n        }\n        var zahlen = { art: null, eintraege: 0, bytes: utf8Laenge(s), hosts: {}, mitLastmod: 0, lastmodVerschieden: 0, bilder: 0, videos: 0, news: 0, hreflang: 0, fremdNs: {} };\n        var index = null;\n        function ergebnis() {\n            reihe.sort(function (a, c) { return STUFEN.indexOf(a.stufe) - STUFEN.indexOf(c.stufe); });\n            var zaehl = { fehler: 0, warnung: 0, hinweis: 0, gut: 0 };\n            reihe.forEach(function (f) { zaehl[f.stufe]++; });\n            if (!index) { index = zeilenIndex(s); }\n            reihe.forEach(function (f) { f.zeilen = f.stellen.map(function (o) { return position(index, o).zeile; }); });\n            return { befunde: reihe, stufen: zaehl, zahlen: zahlen, urteil: zaehl.fehler ? 'fehler' : (zaehl.warnung ? 'warnung' : 'gut') };\n        }\n\n        if (!\/\\S\/.test(s)) { b('leer', 'fehler'); return ergebnis(); }\n        var x = xmlLesen(s);\n        if (x.fehler) {\n            index = zeilenIndex(s);\n            var pos = position(index, x.fehler.off), d = Object.assign({ code: x.fehler.code, zeile: pos.zeile, spalte: pos.spalte }, x.fehler.daten);\n            if (d.off_offen !== undefined) { d.zeile_offen = position(index, d.off_offen).zeile; delete d.off_offen; }\n            b('xml_kaputt', 'fehler', x.fehler.off, d);\n            return ergebnis();\n        }\n        if (x.decl) {\n            var enc = \/encoding\\s*=\\s*[\"']([^\"']+)[\"']\/i.exec(x.decl);\n            if (enc &#038;&#038; !\/^utf-?8$\/i.test(enc[1])) { b('encoding', 'fehler', 0, { wert: enc[1] }); }\n        }\n        if (x.doctype) { b('doctype', 'hinweis', 0); }\n        if (zahlen.bytes > MAX_BYTES) { b('zu_gross', 'fehler', null, { mb: (zahlen.bytes \/ 1048576).toFixed(1) }); }<\/p>\n<p>        var w = x.wurzel;\n        if (w.lokal !== 'urlset' && w.lokal !== 'sitemapindex') { b('wurzel_falsch', 'fehler', w.off, { name: w.name }); return ergebnis(); }\n        var istIndex = w.lokal === 'sitemapindex';\n        zahlen.art = istIndex ? 'index' : 'urlset';\n        if (w.prefix) { b('wurzel_prefix', 'hinweis', w.off, { name: w.name }); }\n        if (w.ns !== NS_SM) { b(w.ns ? 'ns_falsch' : 'ns_fehlt', 'fehler', w.off, { ns: w.ns }); }\n        var smNs = w.ns;<\/p>\n<p>        var basis = null;\n        if (opt.datei) {\n            var dt = urlTeile(String(opt.datei).trim());\n            if (dt) { basis = { schema: dt.schema, host: dt.host, ordner: dt.pfad.replace(\/[^\\\/]*$\/, '') }; }\n            else { b('datei_adresse', 'warnung', null, { wert: opt.datei }); }\n        }<\/p>\n<p>        var eintragName = istIndex ? 'sitemap' : 'url';\n        var eintraege = [];\n        w.kinder.forEach(function (k) {\n            if (k.ns === smNs && k.lokal === eintragName) { eintraege.push(k); }\n            else if (k.ns === smNs) { b('element_unbekannt', 'fehler', k.off, { name: k.name, in: w.name }); }\n            else { zahlen.fremdNs[k.ns || '-'] = (zahlen.fremdNs[k.ns || '-'] || 0) + 1; }\n        });\n        zahlen.eintraege = eintraege.length;\n        if (!eintraege.length) { b('leer_liste', 'warnung', w.off); }\n        if (eintraege.length > MAX_EINTRAEGE) { b('zu_viele', 'fehler', null, { n: eintraege.length }); }<\/p>\n<p>        var ORDNUNG = istIndex ? { loc: 0, lastmod: 1 } : { loc: 0, lastmod: 1, changefreq: 2, priority: 3 };\n        var gesehen = {}, schemas = {}, lastmodWerte = {}, prio = 0, cf = 0;\n        var hrefs = {}, hreflangListen = [];<\/p>\n<p>        eintraege.forEach(function (e) {\n            var stufeVor = -1, reihenfolgeGemeldet = false, zaehlKern = {};\n            e.kinder.forEach(function (k) {\n                var rang;\n                if (k.ns === smNs) {\n                    if (!Object.prototype.hasOwnProperty.call(ORDNUNG, k.lokal)) { b('element_unbekannt', 'fehler', k.off, { name: k.name, in: e.name }); return; }\n                    zaehlKern[k.lokal] = (zaehlKern[k.lokal] || 0) + 1;\n                    if (zaehlKern[k.lokal] === 2) { b('element_doppelt', 'fehler', k.off, { name: k.name }); }\n                    rang = ORDNUNG[k.lokal];\n                } else { rang = 9; }\n                if (rang < stufeVor &#038;&#038; !reihenfolgeGemeldet) { b('reihenfolge', 'hinweis', k.off); reihenfolgeGemeldet = true; }\n                stufeVor = Math.max(stufeVor, rang);\n            });\n\n            var locK = kind(e, smNs, 'loc');\n            var loc = textVon(locK);\n            if (!locK || !loc) { b('loc_fehlt', 'fehler', e.off); }\n            else {\n                if (locK.text !== loc) { b('loc_leerraum', 'hinweis', locK.off); }\n                urlProbleme(loc).forEach(function (p) { b('loc_' + p, p === 'fragment' || p === 'unkodiert' ? 'warnung' : 'fehler', locK.off, { wert: loc.slice(0, 120) }); });\n                var t = urlTeile(loc);\n                if (t) {\n                    zahlen.hosts[t.host] = (zahlen.hosts[t.host] || 0) + 1;\n                    schemas[t.schema] = (schemas[t.schema] || 0) + 1;\n                    if (basis &#038;&#038; t.host !== basis.host) { b(istIndex ? 'index_fremdhost' : 'ort_fremdhost', 'warnung', locK.off, { wert: loc.slice(0, 120), host: basis.host }); }\n                    else if (basis &#038;&#038; !unterhalb(loc, basis)) { b(istIndex ? 'index_ausserhalb' : 'ort_ausserhalb', 'hinweis', locK.off, { wert: loc.slice(0, 120), ordner: basis.schema + ':\/\/' + basis.host + basis.ordner }); }\n                }\n                if (gesehen[loc]) { b('doppelt', 'warnung', locK.off, { wert: loc.slice(0, 120) }); } else { gesehen[loc] = true; }\n            }\n\n            var lm = kind(e, smNs, 'lastmod');\n            if (lm) {\n                var lmw = textVon(lm), art = datumArt(lmw);\n                if (art === 'falsch') { b('lastmod_format', 'fehler', lm.off, { wert: lmw.slice(0, 40) }); }\n                else {\n                    zahlen.mitLastmod++;\n                    lastmodWerte[lmw] = true;\n                    if (art === 'ohne_zone') { b('lastmod_ohne_zone', 'warnung', lm.off, { wert: lmw }); }\n                    if (datumMs(lmw) > jetzt + 86400000) { b('lastmod_zukunft', 'warnung', lm.off, { wert: lmw }); }\n                }\n            }\n            if (istIndex) { return; }<\/p>\n<p>            var cfK = kind(e, smNs, 'changefreq');\n            if (cfK) { cf++; if (CHANGEFREQ.indexOf(textVon(cfK)) === -1) { b('changefreq_wert', 'fehler', cfK.off, { wert: textVon(cfK).slice(0, 30) }); } }\n            var prK = kind(e, smNs, 'priority');\n            if (prK) {\n                prio++;\n                var pw = textVon(prK);\n                if (!\/^\\+?(\\d+(\\.\\d*)?|\\.\\d+)$\/.test(pw) || parseFloat(pw) > 1) { b('priority_wert', 'fehler', prK.off, { wert: pw.slice(0, 30) }); }\n            }<\/p>\n<p>            \/\/ Erweiterungen\n            var bilderHier = 0, sprachen = [];\n            e.kinder.forEach(function (k) {\n                if (k.ns === smNs) { return; }\n                if (k.ns === NS_XHTML && k.lokal === 'link') {\n                    zahlen.hreflang++;\n                    var rel = k.attrs.rel, hl = k.attrs.hreflang, href = (k.attrs.href || '').trim();\n                    if (rel !== 'alternate') { b('hreflang_rel', 'fehler', k.off, { wert: rel === undefined ? '-' : rel }); return; }\n                    if (!hl || !hreflangGueltig(hl)) { b('hreflang_code', 'fehler', k.off, { wert: hl === undefined ? '-' : hl }); }\n                    if (!href || urlProbleme(href).some(function (p) { return p === 'relativ' || p === 'schema'; })) { b('hreflang_href', 'fehler', k.off, { wert: href || '-' }); return; }\n                    sprachen.push({ code: (hl || '').toLowerCase(), href: href, off: k.off });\n                } else if (k.ns === NS_IMG) {\n                    if (k.lokal !== 'image') { b('ext_platz', 'fehler', k.off, { name: k.name }); return; }\n                    bilderHier++; zahlen.bilder++;\n                    var il = kind(k, NS_IMG, 'loc');\n                    if (!il || !textVon(il)) { b('bild_loc_fehlt', 'fehler', k.off); }\n                    else if (urlProbleme(textVon(il)).some(function (p) { return p === 'relativ' || p === 'schema'; })) { b('bild_url', 'fehler', il.off, { wert: textVon(il).slice(0, 120) }); }\n                    k.kinder.forEach(function (c) {\n                        if (c.ns === NS_IMG && \/^(caption|title|geo_location|license)$\/.test(c.lokal)) { b('bild_veraltet', 'hinweis', c.off, { name: c.name }); }\n                    });\n                } else if (k.ns === NS_VID) {\n                    if (k.lokal !== 'video') { b('ext_platz', 'fehler', k.off, { name: k.name }); return; }\n                    zahlen.videos++;\n                    videoPruefen(k, b);\n                } else if (k.ns === NS_NEWS) {\n                    if (k.lokal !== 'news') { b('ext_platz', 'fehler', k.off, { name: k.name }); return; }\n                    zahlen.news++;\n                    newsPruefen(k, b, jetzt);\n                } else if (\/sitemap-(image|video|news)|w3\\.org\\\/1999\\\/xhtml\/i.test(k.ns)) {\n                    b('ns_variante', 'fehler', k.off, { name: k.name, ns: k.ns });\n                } else {\n                    zahlen.fremdNs[k.ns || '-'] = (zahlen.fremdNs[k.ns || '-'] || 0) + 1;\n                }\n            });\n            if (bilderHier > 1000) { b('bild_zu_viele', 'fehler', e.off, { n: bilderHier }); }\n            if (sprachen.length && loc) {\n                var codes = {};\n                sprachen.forEach(function (sp) {\n                    if (codes[sp.code] !== undefined && codes[sp.code] !== sp.href) { b('hreflang_doppelt', 'fehler', sp.off, { wert: sp.code }); }\n                    codes[sp.code] = sp.href;\n                });\n                hrefs[loc] = sprachen.map(function (sp) { return sp.href; });\n                hreflangListen.push({ loc: loc, off: locK.off, sprachen: sprachen });\n            }\n        });<\/p>\n<p>        \/\/ hreflang: Selbstbezug und Rueckverweis innerhalb der Datei\n        if (hreflangListen.length) {\n            var extern = 0, rueckFehlt = 0, selbstFehlt = 0;\n            hreflangListen.forEach(function (h) {\n                var ziele = hrefs[h.loc];\n                if (ziele.indexOf(h.loc) === -1) { selbstFehlt++; b('hreflang_selbst', 'warnung', h.off, { wert: h.loc.slice(0, 120) }); }\n                h.sprachen.forEach(function (sp) {\n                    if (sp.href === h.loc) { return; }\n                    if (!gesehen[sp.href]) { extern++; return; }\n                    var zurueck = hrefs[sp.href];\n                    if (!zurueck || zurueck.indexOf(h.loc) === -1) { rueckFehlt++; b('hreflang_rueck', 'warnung', sp.off, { von: h.loc.slice(0, 120), nach: sp.href.slice(0, 120) }); }\n                });\n            });\n            if (extern) { b('hreflang_extern', 'hinweis', null, { n: extern }); }\n            if (!rueckFehlt && !selbstFehlt && !sammel.hreflang_code && !sammel.hreflang_doppelt) { b('hreflang_ok', 'gut', null, { n: hreflangListen.length }); }\n        }\n        if (zahlen.news > 1000) { b('news_zu_viele', 'fehler', null, { n: zahlen.news }); }<\/p>\n<p>        \/\/ Ueber die ganze Datei\n        var hostListe = Object.keys(zahlen.hosts);\n        if (!basis && hostListe.length > 1) { b('host_gemischt', 'warnung', null, { n: hostListe.length, liste: hostListe.slice(0, 4).join(', ') }); }\n        if (!basis && Object.keys(schemas).length > 1) { b('schema_gemischt', 'warnung', null, { http: schemas.http || 0, https: schemas.https || 0 }); }\n        zahlen.lastmodVerschieden = Object.keys(lastmodWerte).length;\n        if (eintraege.length) {\n            if (zahlen.mitLastmod === 0 && !sammel.lastmod_format) { b('lastmod_fehlt', 'hinweis'); }\n            else if (zahlen.mitLastmod < eintraege.length &#038;&#038; !sammel.lastmod_format) { b('lastmod_teil', 'hinweis', null, { mit: zahlen.mitLastmod, n: eintraege.length }); }\n            if (zahlen.mitLastmod >= 5 && zahlen.lastmodVerschieden === 1) { b('lastmod_gleich', 'hinweis', null, { wert: Object.keys(lastmodWerte)[0], n: zahlen.mitLastmod }); }\n        }\n        if (prio || cf) { b('prio_cf', 'hinweis', null, { priority: prio, changefreq: cf }); }\n        var fremd = Object.keys(zahlen.fremdNs);\n        if (fremd.length) { b('fremd_ns', 'hinweis', null, { liste: fremd.slice(0, 3).join(', ') }); }\n        var zaehlNoch = reihe.filter(function (f) { return f.stufe === 'fehler' || f.stufe === 'warnung'; }).length;\n        if (!zaehlNoch) { b('sauber', 'gut', null, { n: eintraege.length }); }\n        return ergebnis();\n    }<\/p>\n<p>    function videoPruefen(v, b) {\n        var fehlt = [];\n        ['thumbnail_loc', 'title', 'description'].forEach(function (n) { if (!textVon(kind(v, NS_VID, n))) { fehlt.push('video:' + n); } });\n        var cl = kind(v, NS_VID, 'content_loc'), pl = kind(v, NS_VID, 'player_loc');\n        if (!textVon(cl) && !textVon(pl)) { fehlt.push('video:content_loc \/ video:player_loc'); }\n        if (fehlt.length) { b('video_pflicht', 'fehler', v.off, { liste: fehlt.join(', ') }); }\n        var de = textVon(kind(v, NS_VID, 'description'));\n        if (de.length > 2048) { b('video_beschreibung', 'fehler', v.off, { n: de.length }); }\n        var du = kind(v, NS_VID, 'duration');\n        if (du && !(\/^\\d+$\/.test(textVon(du)) && +textVon(du) >= 1 && +textVon(du) <= 28800)) { b('video_dauer', 'fehler', du.off, { wert: textVon(du).slice(0, 20) }); }\n        var ra = kind(v, NS_VID, 'rating');\n        if (ra &#038;&#038; !(\/^\\d+(\\.\\d+)?$\/.test(textVon(ra)) &#038;&#038; +textVon(ra) <= 5)) { b('video_rating', 'fehler', ra.off, { wert: textVon(ra).slice(0, 20) }); }\n        ['publication_date', 'expiration_date'].forEach(function (n) {\n            var k = kind(v, NS_VID, n);\n            if (k &#038;&#038; datumArt(textVon(k)) !== 'ok') { b('video_datum', 'fehler', k.off, { name: 'video:' + n, wert: textVon(k).slice(0, 40) }); }\n        });\n        ['family_friendly', 'requires_subscription', 'live'].forEach(function (n) {\n            var k = kind(v, NS_VID, n);\n            if (k &#038;&#038; !\/^(yes|no)$\/.test(textVon(k))) { b('video_janein', 'fehler', k.off, { name: 'video:' + n, wert: textVon(k).slice(0, 20) }); }\n        });\n        ['restriction', 'platform'].forEach(function (n) {\n            kinderVon(v, NS_VID, n).forEach(function (k) {\n                if (!\/^(allow|deny)$\/.test(k.attrs.relationship || '')) { b('video_relationship', 'fehler', k.off, { name: 'video:' + n }); }\n                if (n === 'platform' &#038;&#038; !\/^(web|mobile|tv)(\\s+(web|mobile|tv))*$\/.test(textVon(k))) { b('video_platform', 'fehler', k.off, { wert: textVon(k).slice(0, 30) }); }\n            });\n        });\n        var tags = kinderVon(v, NS_VID, 'tag').length;\n        if (tags > 32) { b('video_tags', 'warnung', v.off, { n: tags }); }\n        var up = kind(v, NS_VID, 'uploader');\n        if (up && textVon(up).length > 255) { b('video_uploader', 'fehler', up.off, { n: textVon(up).length }); }\n        v.kinder.forEach(function (c) { if (c.ns === NS_VID && \/^(category|gallery_loc|price|tvshow)$\/.test(c.lokal)) { b('video_veraltet', 'hinweis', c.off, { name: c.name }); } });\n        if (pl && (pl.attrs.autoplay !== undefined || pl.attrs.allow_embed !== undefined)) { b('video_veraltet', 'hinweis', pl.off, { name: pl.name + ' @' + (pl.attrs.autoplay !== undefined ? 'autoplay' : 'allow_embed') }); }\n    }<\/p>\n<p>    function newsPruefen(nk, b, jetzt) {\n        var fehlt = [], pub = kind(nk, NS_NEWS, 'publication');\n        if (!pub) { fehlt.push('news:publication'); }\n        else {\n            if (!textVon(kind(pub, NS_NEWS, 'name'))) { fehlt.push('news:name'); }\n            var la = kind(pub, NS_NEWS, 'language');\n            if (!textVon(la)) { fehlt.push('news:language'); }\n            else if (!\/^([a-z]{2,3}|zh-cn|zh-tw)$\/.test(textVon(la))) { b('news_sprache', 'fehler', la.off, { wert: textVon(la).slice(0, 20) }); }\n        }\n        var pd = kind(nk, NS_NEWS, 'publication_date');\n        if (!textVon(pd)) { fehlt.push('news:publication_date'); }\n        else if (datumArt(textVon(pd)) !== 'ok') { b('news_datum', 'fehler', pd.off, { wert: textVon(pd).slice(0, 40) }); }\n        else if (datumMs(textVon(pd)) < jetzt - 2 * 86400000) { b('news_alt', 'warnung', pd.off, { wert: textVon(pd) }); }\n        if (!textVon(kind(nk, NS_NEWS, 'title'))) { fehlt.push('news:title'); }\n        if (fehlt.length) { b('news_pflicht', 'fehler', nk.off, { liste: fehlt.join(', ') }); }\n    }\n    \/\/ KERN-ENDE\n\n    \/\/ --- Darstellung -------------------------------------------------------------\n    function text(schluessel, werte) {\n        var vorlage = T[schluessel] === undefined ? schluessel : String(T[schluessel]);\n        return vorlage.replace(\/\\{(\\w+)\\}\/g, function (m, k) { return werte &#038;&#038; werte[k] !== undefined ? String(werte[k]) : m; });\n    }\n    function zahl(x) { return String(x).replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, T.tausender); }\n    function el(id) { return document.getElementById(id); }\n    function meldung(f) {\n        var d = Object.assign({}, f.daten);\n        Object.keys(d).forEach(function (k) { if (typeof d[k] === 'number') { d[k] = zahl(d[k]); } });\n        if (f.key === 'xml_kaputt') {\n            d.grund = text('xml_' + f.daten.code, d);\n            return text('b_xml_kaputt', d);\n        }\n        return text('b_' + f.key, d);\n    }\n    function zeile(tbody, name, wert) {\n        var tr = document.createElement('tr'), a = document.createElement('td'), c = document.createElement('td');\n        a.textContent = name; c.textContent = wert; c.className = 'sv-wert';\n        tr.appendChild(a); tr.appendChild(c); tbody.appendChild(tr);\n    }\n    function status(t, schlecht) { var s = el('sv-status'); s.textContent = t; s.className = 'sv-status' + (schlecht ? ' sv-schlecht' : ''); }\n\n    function zeigen(r, quelleText) {\n        var z = r.zahlen, tb = el('sv-zahlen'), ul = el('sv-befunde');\n        tb.textContent = ''; ul.textContent = '';\n        zeile(tb, T.z_art, z.art === 'index' ? T.art_index : (z.art === 'urlset' ? T.art_urlset : '\u2013'));\n        zeile(tb, z.art === 'index' ? T.z_sitemaps : T.z_eintraege, zahl(z.eintraege));\n        zeile(tb, T.z_groesse, text('groesse_wert', { kb: zahl(Math.round(z.bytes \/ 1024)), anteil: (z.bytes \/ MAX_BYTES * 100).toFixed(1).replace('.', T.dezimal) }));\n        var hosts = Object.keys(z.hosts);\n        zeile(tb, T.z_hosts, hosts.length ? hosts.slice(0, 4).join(', ') + (hosts.length > 4 ? ' \u2026' : '') : '\u2013');\n        if (z.eintraege) { zeile(tb, T.z_lastmod, text('lastmod_wert', { mit: zahl(z.mitLastmod), n: zahl(z.eintraege), verschieden: zahl(z.lastmodVerschieden) })); }\n        if (z.art === 'urlset') { zeile(tb, T.z_erweiterungen, text('erw_wert', { hreflang: zahl(z.hreflang), bilder: zahl(z.bilder), videos: zahl(z.videos), news: zahl(z.news) })); }\n        zeile(tb, T.z_urteil, text('urteil_' + r.urteil, r.stufen));\n        r.befunde.forEach(function (f) {\n            var li = document.createElement('li'), marke = document.createElement('span'), inhalt = document.createElement('span');\n            marke.className = 'sv-marke sv-' + f.stufe; marke.textContent = T['stufe_' + f.stufe];\n            inhalt.textContent = meldung(f);\n            if (f.zeilen && f.zeilen.length) {\n                var zl = document.createElement('span');\n                zl.className = 'sv-zeilen';\n                zl.textContent = text(f.n > 1 ? 'zeilen_mehr' : 'zeilen_eine', { liste: f.zeilen.join(', ') + (f.n > f.zeilen.length ? ' \u2026' : ''), n: zahl(f.n) });\n                inhalt.appendChild(zl);\n            } else if (f.n > 1) {\n                var zn = document.createElement('span'); zn.className = 'sv-zeilen'; zn.textContent = text('anzahl', { n: zahl(f.n) }); inhalt.appendChild(zn);\n            }\n            li.appendChild(marke); li.appendChild(inhalt); ul.appendChild(li);\n        });\n        el('sv-ergebnis').hidden = false;\n        status(quelleText || '', false);\n    }<\/p>\n<p>    function los(quelleText) {\n        var s = el('sv-xml').value;\n        if (!\/\\S\/.test(s)) { el('sv-ergebnis').hidden = true; status(T.s_leer, true); return null; }\n        var r = pruefen(s, { datei: el('sv-adresse').value.trim() });\n        zeigen(r, quelleText);\n        return r;\n    }\n    \/\/ Grosse Dateien: erst die Statuszeile zeichnen lassen, dann rechnen\n    function losSpaeter(quelleText) {\n        if (el('sv-xml').value.length > 2000000) { status(T.s_pruefe, false); setTimeout(function () { los(quelleText); }, 30); }\n        else { los(quelleText); }\n    }<\/p>\n<p>    function dateiLesen(datei) {\n        if (!datei) { return Promise.resolve(null); }\n        if (datei.size > 60 * 1048576) { status(T.s_zu_gross, true); return Promise.resolve(null); }\n        status(T.s_lese, false);\n        return datei.slice(0, 2).arrayBuffer().then(function (kopf) {\n            var k = new Uint8Array(kopf), gz = k[0] === 0x1f && k[1] === 0x8b;\n            if (gz && typeof DecompressionStream === 'undefined') { throw new Error('gz'); }\n            var strom = gz ? datei.stream().pipeThrough(new DecompressionStream('gzip')) : datei.stream();\n            return new Response(strom).arrayBuffer().then(function (buf) {\n                if (buf.byteLength > 60 * 1048576) { throw new Error('gross'); }\n                var txt;\n                try { txt = new TextDecoder('utf-8', { fatal: true }).decode(buf); }\n                catch (e) { throw new Error('utf8'); }\n                el('sv-xml').value = txt;\n                return los(text(gz ? 's_datei_gz' : 's_datei', { name: datei.name, kb: zahl(Math.round(buf.byteLength \/ 1024)) }));\n            });\n        }).catch(function (e) {\n            el('sv-ergebnis').hidden = true;\n            status(e.message === 'utf8' ? T.s_utf8 : (e.message === 'gross' ? T.s_zu_gross : T.s_lesefehler), true);\n            return null;\n        });\n    }<\/p>\n<p>    var BEISPIEL = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n' +\n        '<urlset xmlns=\"http:\/\/www.sitemaps.org\/schemas\/sitemap\/0.9\"\\n' +\n        '        xmlns:xhtml=\"http:\/\/www.w3.org\/1999\/xhtml\"\\n' +\n        '        xmlns:image=\"http:\/\/www.google.com\/schemas\/sitemap-image\/1.1\">\\n' +\n        '  <url>\\n' +\n        '    <loc>https:\/\/example.com\/en\/pricing\/<\/loc>\\n' +\n        '    <lastmod>2026-09-28<\/lastmod>\\n' +\n        '    <xhtml:link rel=\"alternate\" hreflang=\"en\" href=\"https:\/\/example.com\/en\/pricing\/\"\/>\\n' +\n        '    <xhtml:link rel=\"alternate\" hreflang=\"de\" href=\"https:\/\/example.com\/de\/preise\/\"\/>\\n' +\n        '    <image:image><image:loc>https:\/\/example.com\/img\/plans.png<\/image:loc><image:caption>Plans<\/image:caption><\/image:image>\\n' +\n        '  <\/url>\\n' +\n        '  <url>\\n' +\n        '    <loc>https:\/\/example.com\/de\/preise\/<\/loc>\\n' +\n        '    <lastmod>2026-09-28T14:05<\/lastmod>\\n' +\n        '    <xhtml:link rel=\"alternate\" hreflang=\"de\" href=\"https:\/\/example.com\/de\/preise\/\"\/>\\n' +\n        '  <\/url>\\n' +\n        '  <url>\\n' +\n        '    <loc>\/en\/contact\/<\/loc>\\n' +\n        '    <priority>1.5<\/priority>\\n' +\n        '  <\/url>\\n' +\n        '  <url>\\n' +\n        '    <loc>https:\/\/example.com\/en\/pricing\/<\/loc>\\n' +\n        '    <changefreq>sometimes<\/changefreq>\\n' +\n        '  <\/url>\\n' +\n        '<\/urlset>\\n';<\/p>\n<p>    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.SITEMAP = { T: T, xmlLesen: xmlLesen, pruefen: pruefen, datumArt: datumArt, urlProbleme: urlProbleme, hreflangGueltig: hreflangGueltig,\n        meldung: meldung, los: los, BEISPIEL: BEISPIEL };<\/p>\n<p>    if (!el('sv-wurzel') || !el('sv-xml')) { return; }\n    el('sv-los').addEventListener('click', function () { losSpaeter(''); });\n    el('sv-beispiel').addEventListener('click', function () { el('sv-xml').value = BEISPIEL; el('sv-adresse').value = 'https:\/\/example.com\/sitemap.xml'; los(T.s_beispiel); });\n    el('sv-leeren').addEventListener('click', function () { el('sv-xml').value = ''; el('sv-adresse').value = ''; el('sv-datei').value = ''; el('sv-ergebnis').hidden = true; status('', false); });\n    el('sv-datei').addEventListener('change', function () { dateiLesen(this.files && this.files[0]); });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sprawdza w przegl\u0105darce map\u0119 witryny XML lub indeks map wzgl\u0119dem sitemaps.org i rozszerze\u0144 Google: poprawno\u015b\u0107 sk\u0142adni z numerem wiersza i kolumny, przestrzenie nazw, pola obowi\u0105zkowe, lastmod, limity, hreflang z odno\u015bnikami zwrotnymi oraz tagi obraz\u00f3w, wideo i news\u00f3w.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92097,92295,92762],"class_list":["post-20963","page","type-page","status-publish","hentry","tag-data-quality-pl","tag-seo-pl","tag-web-development-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Sitemap Checker &amp; Validator: schemat, hreflang oraz rozszerzenia dla obraz\u00f3w, wideo i news\u00f3w | Lukas Wojcik<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/sitemap-checker-validator-schema-hreflang-image-video-news\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sitemap Checker &amp; Validator: schemat, hreflang oraz rozszerzenia dla obraz\u00f3w, wideo i news\u00f3w | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Sprawdza w przegl\u0105darce map\u0119 witryny XML lub indeks map wzgl\u0119dem sitemaps.org i rozszerze\u0144 Google: poprawno\u015b\u0107 sk\u0142adni z numerem wiersza i kolumny, przestrzenie nazw, pola obowi\u0105zkowe, lastmod, limity, hreflang z odno\u015bnikami zwrotnymi oraz tagi obraz\u00f3w, wideo i news\u00f3w.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/sitemap-checker-validator-schema-hreflang-image-video-news\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-01T16:29:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/sitemap-checker-validator-schema-hreflang-image-video-news\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/sitemap-checker-validator-schema-hreflang-image-video-news\\\/\",\"name\":\"Sitemap Checker & Validator: schemat, hreflang oraz rozszerzenia dla obraz\u00f3w, wideo i news\u00f3w | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-10-01T16:14:12+00:00\",\"dateModified\":\"2026-10-01T16:29:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/sitemap-checker-validator-schema-hreflang-image-video-news\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/sitemap-checker-validator-schema-hreflang-image-video-news\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/sitemap-checker-validator-schema-hreflang-image-video-news\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Sitemap Checker &#038; Validator: schemat, hreflang oraz rozszerzenia dla obraz\u00f3w, wideo i news\u00f3w\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Sitemap Checker & Validator: schemat, hreflang oraz rozszerzenia dla obraz\u00f3w, wideo i news\u00f3w | Lukas Wojcik","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/sitemap-checker-validator-schema-hreflang-image-video-news\/","og_locale":"en_US","og_type":"article","og_title":"Sitemap Checker & Validator: schemat, hreflang oraz rozszerzenia dla obraz\u00f3w, wideo i news\u00f3w | Lukas Wojcik","og_description":"Sprawdza w przegl\u0105darce map\u0119 witryny XML lub indeks map wzgl\u0119dem sitemaps.org i rozszerze\u0144 Google: poprawno\u015b\u0107 sk\u0142adni z numerem wiersza i kolumny, przestrzenie nazw, pola obowi\u0105zkowe, lastmod, limity, hreflang z odno\u015bnikami zwrotnymi oraz tagi obraz\u00f3w, wideo i news\u00f3w.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/sitemap-checker-validator-schema-hreflang-image-video-news\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-10-01T16:29:23+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/sitemap-checker-validator-schema-hreflang-image-video-news\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/sitemap-checker-validator-schema-hreflang-image-video-news\/","name":"Sitemap Checker & Validator: schemat, hreflang oraz rozszerzenia dla obraz\u00f3w, wideo i news\u00f3w | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-10-01T16:14:12+00:00","dateModified":"2026-10-01T16:29:23+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/sitemap-checker-validator-schema-hreflang-image-video-news\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/sitemap-checker-validator-schema-hreflang-image-video-news\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/sitemap-checker-validator-schema-hreflang-image-video-news\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"Sitemap Checker &#038; Validator: schemat, hreflang oraz rozszerzenia dla obraz\u00f3w, wideo i news\u00f3w"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20963","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=20963"}],"version-history":[{"count":1,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20963\/revisions"}],"predecessor-version":[{"id":20975,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20963\/revisions\/20975"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=20963"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=20963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}