- XSLT, web tarayıcısında çalışan istemci tarafı derleme sistemi gibi kullanılarak XML verilerini HTML’ye dönüştürebilir ve statik site oluşturucuların karmaşıklığını azaltabilir
- Tipik bir statik site;
.json, .md, .txt gibi verilerden, Hugo, Next.js, Astro gibi derleme sistemlerinden ve statik HTML çıktısından oluşur; ancak büyük framework’ler basit bir Markdown blogu için bile gereğinden fazla karmaşıklık yaratabilir
- Yalnızca HTML ve CSS kullanmaya çalışırsanız, birden çok sayfanın header ve footer bölümlerini elle kopyalamanız gerekir; HTML import yoktur ve Web Component’ler JavaScript motoru gerektirir
- Bir XML belgesine
<?xml-stylesheet type="text/xsl" href="blog.xsl"?> ekleyip XSLT şablonları yazarsanız, tarayıcı ziyaret anında HTML çıktısı üretebilir
- Bu yöntem JavaScript olmadan statik dosyalar olarak dağıtılabilir; ancak her şeyin yerini alan kusursuz bir çözüm değildir, web geliştirme araç kutusuna eklenebilecek başka bir seçenektir
Statik site derlemenin karmaşıklığı
- Tipik bir statik web sitesi üretim akışı; veri, derleme sistemi ve statik HTML çıktısı olarak ayrılır
- Veriler
.json, .md, .txt gibi dosyalarda saklanır
- Hugo, Next.js, Astro derleme sistemi örnekleridir
- Nihai çıktı statik HTML’dir
- Framework’leri kaldırıp yalnızca basit HTML ve CSS kullanmak isteseniz bile, sayfa sayısı arttıkça ortak header ve footer bölümlerini sürekli kopyalamanız gerekir
- Alternatif olarak akla gelebilecek seçeneklerin her birinin kısıtları vardır
- HTML import mevcut değildir
- Web Component’ler JavaScript gerektirir; dolayısıyla bir JavaScript motoru gerekir
Tarayıcıyı derleme sistemi olarak kullanma fikri
- Web tarayıcısı zaten
text/html, text/markdown, application/xml gibi çeşitli formatları anlayabilir
- Tarayıcıyı veriden HTML üreten bir sistem olarak kullanırsanız, ayrı bir derleme aracı olmadan web standartlarına dayalı bir akış oluşturabilirsiniz
- RSS feed’lerini daha okunabilir göstermeye çalışırken, XSLT’nin XML belgeleri için stil sayfası olarak kullanılabileceği keşfedildi
- XML, HTML’e benzer görünse de yalnızca web verileriyle sınırlı olmayan bir veri temsil yöntemidir ve XML spec üzerinden incelenebilir
XML’den HTML’ye dönüştürme yöntemi
- XML belgeleri blog yazısı gibi verileri taşıyabilir
<?xml version="1.0"?>
<blog>
<post id="42" publishedAt="2025-06-26">
<title>Hello XSLT</title>
<tags>…</tags>
</post>
</blog>
- XML belgesine XSL stil sayfasını bağlayan bir bildirim eklenebilir
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="blog.xsl"?>
<blog>
<post id="42" publishedAt="2025-06-26">
<title>Hello XSLT</title>
<tags>…</tags>
</post>
</blog>
- XSLT şablonu XML girdisini alır ve HTML yapısı çıktılar
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" />
<xsl:template match="/">
<html>
<head> … </head>
<body> … </body>
</html>
</xsl:template>
</xsl:stylesheet>
- XSLT,
(XML) => HTML biçiminde düşünülebilir ve döngüler, değişkenler, import gibi derleme sistemi özellikleri sağlar
- Üst XML belgesindeki veriler XSLT içinden alınarak dinamik biçimde çıktılanabilir
<head>
<xsl:value-of select="title" /> | Blog
</head>
Çalıştırma ve dağıtım yöntemi
- XML dosyasını tarayıcıyla açarak XSLT dönüşümü çalıştırılabilir
open blog.xml -a Safari
- Tüm web tarayıcıları sayfa ziyareti sırasında XSLT dönüşümünü destekler ve dönüşüm sonucu oluşan HTML’i gösterir
- Bu yöntem, kullanıcının bilgisayarında çalışan istemci tarafı derleme sistemi gibi davranır
- Statik dosya dağıtımı kolaydır ve JavaScript olmadan çalışır
Sınırlamalar ve konumlandırma
- Blog verilerini JSON yerine XML olarak saklamak gerekir; ancak XML, HTML gibi görünür, ayrıştırması kolaydır, esnektir ve web’de yerel olarak desteklenir
- XSLT yöntemi kusursuz değildir ve her şeyin yerini almaz
- Eski web standartlarından, spesifikasyonlardan ve tarayıcı özelliklerinden yararlanarak basit statik web siteleri üretmek için kullanılabilecek başka bir araç hâline gelir
1 yorum
Hacker News yorumları
XML şablonlarında XSLT’yi yoğun kullanan bir şirkette çalışmıştım; iyi değildi ve mümkün olsaydı muhtemelen başka bir şeye geçerdik.
Yeni standartlar olsa da XSLT 1.0 hâlâ baskın ve daha yeni standartlara kıyasla sınırlı ve tuhaf.
XSLT şablonlarındaki performans sorunlarını çözmek cehenneme yakın. Turing-tam, fonksiyonel tarzda bir dil ama performans büyük ölçüde soyutlanmış durumda; çoğu belgede düzgün çalışan bir şablon, 100 satırlık tek bir tabloda patlayabiliyor. Meğerse tablo işleme şablonu O(N^2) ya da daha kötüymüş; her satırda XPath ayrıca O(N) ya da daha kötü olabiliyor ve nasıl optimize edileceği de pek belli değildi. Hatırladığım kadarıyla tek bir belgeyi XSLT ile işlemek 7 dakikadan uzun sürmüştü.
JS’in başka sorunları olabilir ama algoritmik karmaşıklık sorunlarını çözememek bunlardan biri değil.
Artık key (indeks) gibi özelliklerle işlemeyi ciddi ölçüde hızlandırabiliyorsunuz; Saxon gibi iyi XSLT uygulamaları da performans açısından kesinlikle yardımcı oluyor.
XML’i başka biçimlere dönüştürürken mantığı yapılandırabildiği için XSLT oldukça kullanışlı.
2013’te XSLT’yi yoğun kullanıyordum; o zaman bile 1.0 her açıdan tamamen ölmüş durumdaydı. Saxon, XSLT 2 için ücretsizdi ve harikaydı.
Hem devasa belgeleri hem de çok sayıda küçük belgeyi dönüştürdük ama hiç performans sorunu yaşamadık.
Alışınca Sudoku çözmüş gibi bir tatmin veriyor ama genellikle hedefe ulaşmak için çok daha az araç yeterli olduğundan, build ya da şablonlama için standart yaklaşım olması zor.
Üstelik XML de herkesin sevdiği bir format değil.
Yanlış hatırlamıyorsam epey akıllı optimizasyonlar da yapıyordu.
Epey zorlama bir tahmin olabilir ama 1990–2000’lerde tarayıcılar birbirinden çok farklı olduğu için aynı davranışı elde etmek adına JS kullanmaya başladık; aslında ihtiyaç duyulan şey iyi CSS stilleri ve tutarlı davranıştı.
Zamanla tarayıcılar benzer davranmaya başladı ama biz zaten sayfaları tüm tarayıcılarda aynı gösteren framework’lere alışmıştık ve JSON verisini render etme paradigmasına geçmiştik.
Bugünkü teknoloji seviyesiyle sunucunun ürettiği eski usul web sayfaları da gayet kaldırılabilir; ayak izi daha küçük, daha hızlı ve daha az bellek kullanıyor.
Yakın zamanda bir legacy sistem geçişi yaparken 2000’ler tarzı “her HTTP isteğine bir sayfa” yapısını gördüm; ekleme/silme gibi tüm işlemler yenileme gerektirse bile React sisteminden çok daha hızlıydı. İnternet hızlandı, telefon belleğini JS framework’leri israf ediyor ve backend hâlâ çoğunlukla CRUD, sayfalama ve transaction’lardan ibaret.
HN gibi basit yerlerde tam sayfa yenileme iyi uyuyor; JS framework yerine basit bir web sitesinin yeterli olduğu pek çok örnek de var.
Ama herkesin tam sayfa yenilemeye dönebileceği doğru değil. Gerçek web uygulamaları arasında tam yenilemenin berbat bir kullanıcı deneyimi yarattığı durumlar var.
Genel olarak web siteleri, web belgeleri ve web formları tam yenilemeyle yapılabilir; ancak karmaşık şeyleri gösterip manipüle etmesi gereken web uygulamaları için uygun değil.
O dönemde düzeni tutturmak için user agent algılamasına ve türlü quirks sıralarına bel bağlanırdı; JS’in düzenle ilgili öğelere kolayca erişebildiğini de sanmıyorum.
CSS de tutarlılığı hemen getirmedi. Özellikler tamamlandıktan sonra bile ortalık karışıktı; herkes CSS Zen Garden’a hayran kalırken gerçek kodların tablolarla yazıldığı dönemdi.
Framework’lerin “tutarlı görünüm” üzerinde büyük etkisi olup olmadığından da emin değilim. jQuery’den uzaklaşmaya başladığımız sıralarda görünüm zaten CSS’in işiydi.
Her sayfa için birden çok sorgu çalıştırılan ve görünüme özel yanıt biçimleri oluşturmak için çok sayıda karmaşık join kullanılan koşullardan bahsediyorum. HTML string’ine interpolate etmeden önce veriyi doğru biçimde getirirseniz, 100 bin satırlık tablo gibi uç durumlarda performansa büyük faydası oluyor.
Deneyimime göre HTML şablon motoru ile veritabanı ne kadar yakınsa o kadar iyi. Sonuçta yapılandırılmış DOM da istemciye gönderilmesi gereken bir byte akışından ibaret.
StringBuilder ve akıllı SQL sorgularının yeterli olduğu yerlerde sofistike AST/parser yaklaşımları düşünülürken anlamsız ve kendi kendini amaç edinen bir endüstri oluştuğunu düşünüyorum. Karşı argüman genelde geliştiricilerin HTML escape fonksiyonunu düzgün kullanamayacağını varsayan güvenlik denetçisi tavrına varıyordu.
2000’lerde kurumsal XML’in hantallığı yüzünden teknolojinin eski görünmesi ve herkesin daha “temiz” JSON’a yönelmesi üzücü.
XSLT ve XPath çok olgunlaşmıştı ve başka biçimlerde hâlâ yaşanan birçok sorunu çoktan çözmüştü.
Eskiden PHP stream wrapper’larını ve XSLT include’larını suistimal ettiğim güzel anılarım da var.
Eski bir önyargı olabilir ama tarayıcının yerelde işlemesine izin vermek hâlâ biraz tedirgin ediyor. Çünkü eskiden uyumluluk tam bir mayın tarlasıydı.
XML tarafındaki şema gibi şeyler çok daha iyi tanımlanmıştı; JSON tarafının yetişmesi neredeyse 10 yıl sürdü gibi geliyor.
En son ciddi biçimde uğraştığım XML teknolojisi EXI idi; XML belgelerini sıkıştırılmış ikili veri akışına dönüştüren bir aktarım biçimiydi. Çünkü veri yapısını ASCII’ye çevirip sıkıştırarak HTTP üzerinden göndermek ve sonra geri çevirmek biraz komik bir iş.
Şimdi protobuf ailesi daha popüler ama XML varlığını sürdürseydi, birbirine geçen uyumlu standartların dünyası haline gelebilirdi. Buna karşılık protobuf/gRPC ile JSON API’leri arasında sağlam bir duvar var; belki de bu daha iyidir, kim bilir.
XPath de kötü değil. Söz diziminin tamamını hatırlamak zor ama biraz deneme yapınca genelde istediğiniz yere ulaşıyorsunuz.
XSLT ise tamamen delice bir saçmalık; yanıp yok olmalı.
Veride nispeten kararlı yerel değişiklikleri mümkün kılan bir kombinasyon olarak XML + XPath ciddi biçimde hafife alınıyor. XML’in “eski moda” ünü yüzünden mi bilmiyorum, başka oyunlarda pek görmedim ama bu kullanım için çok sağlam bir sistem.
https://rimworldwiki.com/wiki/Modding_Tutorials/PatchOperati...
Ama web furyası büyüyünce W3C ve MS SOAP, WS-* gibi şeyler geliştirdi; XSLT dâhil XML tabanlı birkaç programlama dili de ortaya çıktı.
HN’deki insanlara söylememek gerek ama XSLT aslında Scheme’di, yalnız mutlaka XML olmak zorundaydı; JavaScript’in Java adını ödünç almak zorunda kaldığı aynı çılgınlık dönemiydi.
Bu aralar feed’leri süslemek için XSLT kullanıyorum.
Örneğin https://susam.net/feed.xml ve https://susam.net/feed.xsl.
19 yaşımda profesyonel yazılım mühendisi olarak ilk üstlendiğim projelerden biri, şirketin satın aldığı iki Google Search Appliance cihazını özelleştirmekti.
Şirket, devasa CIFS belge deposunda tam metin arama yapabilmenin iş geliştirme sürecini iyileştireceğini düşünerek, CentOS ve Google tarzı Python çalışan sarı ön panelli Dell sunucu raflarına yüz binlerce dolar harcamıştı.
2011 civarında XHTML modaydı ve GSA, arka uçta XML olarak sağladığı arama sonuçlarını XSLT ile XHTML’e dönüştürüyordu.
Varsayılan şablonları alıp render edilmiş ColdFusion uygulama sayfalarından, StackOverflow’dan ve W3Schools eğitimlerinden çaldığım varlıklar ve işaretlemeyle şirket intranet portalına benzeyen bir canavar oluşturdum.
Sonrasında LinkedIn’de birçok DoD yüklenicisi “XML uzmanlığımı” görüp belge modernizasyonu projelerine katılmam için bana ulaştı; bu deneyimi özgeçmişimden çıkarmam gerektiğini çabucak öğrendim.
JSON yanıtından deserialize edilmiş TypeScript arayüzleri dizisini JSX içinde döndürürken iç çektiğinizde, aynı işi XSLT ile yapan beni hatırlayın.
Birçok kişi XML’in uzun yazdırmasından şikâyet ediyor ve uzaktan bakınca karmaşık görünüyor; ama XML tabanlı iyi dosya biçimleri oluşturup bunları DTD ile doğrulayabilmek, gerekirse XSLT ile insan tarafından okunabilir biçimde formatlayabilmek hoşuma gidiyor.
XML, metin tabanlı dosya biçimlerinin C++’ı gibi. Olgun, pilleri dâhil geliyor, güçlü ve isterseniz her dilde kullanabiliyorsunuz.
Eski ve olgun diller nasıl kendi tuhaflıkları yüzünden eleştiriliyorsa, XML’i kötülemek de moda oldu. Amacınıza uygun değilse kullanmazsınız; ama canavar muamelesi yapmak gerekmiyor.
2000’lerin başında XML ve XSLT’nin ne kadar ileri gittiğine bir örnek olarak, eskiden çalıştığım şirket XML’i hat hızında ayrıştıran ve XSLT’yi çip üzerinde yerel olarak işleyen bir ASIC yapmıştı.
Çünkü internetin geleceğinin tamamen XML/XSLT olacağını öngörmüşlerdi. Intel o şirketi satın aldı ve iç teknoloji SSE hızlandırıcısına girdi.
“XSLT tarayıcıda yerel olarak çalışıyor” sihrinin ne olduğuna şaşırıyorum
XSLT’yi en son yaklaşık 20 yıl önce kullanmıştım ama o dönem birkaç yıl boyunca çok yoğun kullanmıştım. O zamanlar çalıştırmak için devasa ve sallantılı bir kurumsal Java kulesi gerekiyordu; bu da XSLT’nin kendi zarafetini gölgeliyordu
Ama XSLT gerçekten tarayıcıda çalışıyorsa, her yerde barındırılabilen statik şablonlar gibi bir kutsal kâse zaten hep burnumuzun dibindeymiş demektir
Keşke v3 desteği gelse; yerel şablon desteğiyle statik web sayfaları sunmak kolaylaşırdı
CMS, içinde gömülü HTML bulunan XML dosyaları üretiyordu ve bunlar çok iyi önbellekleniyordu. Kişiselleştirme ve HTML/JS render işlemleri sunucu tarafında, önbellekleme proxy’siyle birlikte ele alınıyordu
XSL dönüşümü önbelleğin arkasında çalışıyordu ve yüksek trafiğe yetişecek kadar hızlıydı. Burada XML’in amacı, hazır HTML’i blob olarak koymak ve yalnızca kişiselleştirme gereken kısımları XML etiketi olarak bırakmaktı
Son dönüşüm epey hızlıydı; kilit nokta, XSL dönüştürücüsünün çıktısını tümüyle bellek tamponuna almak yerine doğrudan yanıt çıktı akışına akıtmaktı. Büyük yanıtlarda bugün bile iyi bir teknik; birçok framework varsayılan olarak bellekte tamponlamayı seçtiği için kaçırılan bir nokta
Bugün elbette wasm ile tarayıcıda istediğinizi çalıştırabilirsiniz. Ama o dönemde JavaScript berbattı ve tasarımcılar en iyi ihtimalle Photoshop dosyası teslim ediyordu. Onu frame’lere ve table’lara bölmek gerekiyordu; Google Maps ve Gmail’in yeni çıktığı dönemde, hem Netscape’i hem Internet Explorer’ı destekleyerek oldukça JavaScript-heavy bir CMS arayüzü yapıyorduk
Firefox’ta özellikle can sıkıcı bir bug var: Belge içindeki HTML’i gerçek DOM olarak render etmek için
disable-output-escapinggerektiğinde düzgün çalışmıyor ve ham HTML metni olarak render ediliyorUzun zaman önce, çok uzak bir distopik projede, ekibin Java geliştirmeyi hızla değişen workbook’larla paralel şekilde koordine edemeyeceği konusunda karamsar olan biri bir çözüm bulmuştu
Excel’de hazırlanmış workbook’u Visual Basic XML’e dönüştürüyor, XSLT dosyaları da bu XML’de tanımlanan Struts action’larını işleyecek Java sınıflarını otomatik üretiyordu
https://raganwald.com/2008/02/21/mouse-trap.html
HN tartışması: https://news.ycombinator.com/item?id=120379 · https://news.ycombinator.com/item?id=947952