{"id":59674,"date":"2026-10-19T13:21:14","date_gmt":"2026-10-19T11:21:14","guid":{"rendered":"https:\/\/notiz.blog\/?p=59674"},"modified":"2026-10-19T13:21:14","modified_gmt":"2026-10-19T11:21:14","slug":"xslt-js","status":"publish","type":"post","link":"https:\/\/notiz.blog\/2026\/10\/19\/xslt-js\/","title":{"rendered":"XSLT.js"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Vor ein paar Tagen habe ich mich noch <a href=\"https:\/\/notiz.blog\/2026\/10\/07\/wer-sieht-schon-gerne-xml\/\">dar\u00fcber aufgeregt<\/a>, dass Browser k\u00fcnftig wohl kein XSLT mehr unterst\u00fctzen werden. Es mag sein, dass ich da vielleicht etwas zu <s>hysterisch<\/s> voreilig war.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a rel=\"mention\" class=\"u-url mention\" href=\"https:\/\/fosstodon.org\/@krinkle\">@krinkle<\/a> hat mich in den Kommentaren auf <a href=\"https:\/\/jakearchibald.com\/2025\/making-xml-human-readable-without-xslt\/\" target=\"_blank\" rel=\"noopener\">einen Blogpost<\/a> und einen <a href=\"https:\/\/github.com\/genmon\/aboutfeeds\/pull\/39\" target=\"_blank\" rel=\"noopener\">Pull Request<\/a> hingewiesen, die zeigen wie man mit JavaScript zu einem \u00e4hnlichen Resultat kommt. (Danke nochmal daf\u00fcr!)<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">If you just want to make some existing XSLT work in browsers that don&#8217;t support it, check out <a href=\"https:\/\/github.com\/mfreed7\/xslt_polyfill\">Mason&#8217;s XSLT polyfill<\/a>. But if you don&#8217;t need to use XSLT, JavaScript is, in my opinion, a better option.<\/p>\n<cite><a href=\"https:\/\/jakearchibald.com\/2025\/making-xml-human-readable-without-xslt\/\">Making XML human-readable without XSLT<\/a><\/cite><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Statt JavaScript zu verwenden, um XSLT \u00fcber WebAssembly clientseitig auszuf\u00fchren, k\u00f6nnte man JavaScript auch direkt nutzen, um das XML zu transformieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">H\u00e4tte man auch gleich drauf kommen k\u00f6nnen!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich hab mir also mal einen Abend Zeit genommen und das <a href=\"https:\/\/notiz.blog\/.well-known\/following.opml\">OPML<\/a> f\u00fcr das <a href=\"https:\/\/github.com\/pfefferle\/wordpress-socialspec\/\">SocialSpec Plugin<\/a> (mehr dazu bald) von XSLT auf JavaScript umgezogen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><picture class=\"wp-picture-59733\" style=\"display: contents;\"><source type=\"image\/webp\" srcset=\"https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml-png.webp 2242w, https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml-700x611-png.webp 700w, https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml-900x786-png.webp 900w, https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml-768x671-png.webp 768w, https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml-1536x1341-png.webp 1536w, https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml-2048x1789-png.webp 2048w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\"><img data-dominant-color=\"f2f4f6\" data-has-transparency=\"true\" style=\"--dominant-color: #f2f4f6;\" data-wp-picture-wrapped loading=\"lazy\" decoding=\"async\" width=\"2242\" height=\"1958\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" src=\"https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml.png\" alt=\"Screenshot einer gestalteten OPML-Liste \u201enotizBlog Follows\u201c auf notiz.blog: Ein Hinweiskasten erkl\u00e4rt OPML, darunter stehen abonnierte Blogs mit Beschreibung, Feed-URL und je einem \u201eSubscribe\u201c-Button.\" class=\"wp-image-59733 has-transparency\" srcset=\"https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml.png 2242w, https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml-700x611.png 700w, https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml-900x786.png 900w, https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml-768x671.png 768w, https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml-1536x1341.png 1536w, https:\/\/notiz.blog\/wp-content\/uploads\/2026\/10\/socialspec-follows-opml-2048x1789.png 2048w\" \/><\/picture><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Man bindet &#8222;einfach&#8220; ein <code>script<\/code>-Element mit dem XHTML-Namespace in die XML-Datei ein. Das f\u00fchrt der Browser dann aus.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">opml<\/span> <span class=\"hljs-attr\">version<\/span>=<span class=\"hljs-string\">\"2.0\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">xmlns<\/span>=<span class=\"hljs-string\">\"http:\/\/www.w3.org\/1999\/xhtml\"<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"opml.js\"<\/span> <span class=\"hljs-attr\">defer<\/span>=<span class=\"hljs-string\">\"\"<\/span>\/&gt;<\/span><span class=\"handlebars\"><span class=\"xml\">\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\u2026<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\u2026<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">opml<\/span>&gt;<\/span><\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Das Script liest die Daten aus dem OPML, baut daraus eine HTML-Seite und ersetzt damit das XML (<code>document.documentElement.replaceWith( html )<\/code>). Feed-Reader ignorieren das Script und bekommen weiter das normale OPML.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich arbeite jetzt seit fast zwei Jahrzehnten mit offenen Formaten und Web Standards und bin bei der Technik inzwischen ziemlich leidenschaftslos. Ich finde XSLT zwar immer noch charmanter, aber das hilft ja nicht, wenn kein Browser es unterst\u00fctzt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So lange das Ergebnis das gleiche ist, ist mehr der Weg dahin mittlerweile fast egal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>XSLT ist tot, lang lebe JavaScript!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vor ein paar Tagen habe ich mich noch dar\u00fcber aufgeregt, dass Browser k\u00fcnftig wohl kein XSLT mehr unterst\u00fctzen werden. Es mag sein, dass ich da vielleicht etwas zu hysterisch voreilig war. @krinkle@fosstodon.org hat mich in den Kommentaren auf einen Blogpost und einen Pull Request hingewiesen, die zeigen wie man mit JavaScript zu einem \u00e4hnlichen Resultat [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"webmentions_disabled_pings":false,"webmentions_disabled":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":"","atmosphere_disabled":false,"atmosphere_custom_text":"","atmosphere_reply_restriction":[]},"categories":[2],"tags":[105,768,5171,309,102,103,718],"class_list":["post-59674","post","type-post","status-publish","format-standard","category-web","tag-atom","tag-browser","tag-fediblog","tag-javascript","tag-opml","tag-rss","tag-xslt","h-entry","hentry"],"_links":{"self":[{"href":"https:\/\/notiz.blog\/wp-api\/wp\/v2\/posts\/59674","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/notiz.blog\/wp-api\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/notiz.blog\/wp-api\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/notiz.blog\/wp-api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/notiz.blog\/wp-api\/wp\/v2\/comments?post=59674"}],"version-history":[{"count":4,"href":"https:\/\/notiz.blog\/wp-api\/wp\/v2\/posts\/59674\/revisions"}],"predecessor-version":[{"id":59735,"href":"https:\/\/notiz.blog\/wp-api\/wp\/v2\/posts\/59674\/revisions\/59735"}],"wp:attachment":[{"href":"https:\/\/notiz.blog\/wp-api\/wp\/v2\/media?parent=59674"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/notiz.blog\/wp-api\/wp\/v2\/categories?post=59674"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/notiz.blog\/wp-api\/wp\/v2\/tags?post=59674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}