2 điểm bởi GN⁺ 2025-06-28 | 1 bình luận | Chia sẻ qua WhatsApp
  • Có thể dùng XSLT như một hệ thống build phía client chạy ngay trong trình duyệt web để chuyển dữ liệu XML thành HTML, từ đó giảm bớt sự phức tạp của các static site generator
  • Một website tĩnh điển hình gồm dữ liệu như .json, .md, .txt, hệ thống build như Hugo, Next.js, Astro, và đầu ra HTML tĩnh, nhưng các framework lớn có thể tạo ra độ phức tạp quá mức ngay cả với một blog Markdown đơn giản
  • Nếu chỉ muốn dùng HTML và CSS, bạn sẽ phải tự sao chép header và footer cho nhiều trang, không có HTML import, còn Web Component thì cần JavaScript engine
  • Nếu thêm <?xml-stylesheet type="text/xsl" href="blog.xsl"?> vào tài liệu XML và viết template XSLT, trình duyệt có thể tạo đầu ra HTML tại thời điểm truy cập
  • Cách này có thể được triển khai dưới dạng file tĩnh mà không cần JavaScript, nhưng không phải là lời giải hoàn hảo thay thế mọi thứ, mà là một lựa chọn khác có thể thêm vào bộ công cụ phát triển web

Độ phức tạp của việc build static site

  • Quy trình tạo một website tĩnh thông thường được chia thành dữ liệu, hệ thống build và đầu ra HTML tĩnh
    • Dữ liệu được lưu trong các file như .json, .md, .txt
    • Ví dụ về hệ thống build gồm Hugo, Next.js, Astro
    • Kết quả cuối cùng là HTML tĩnh
  • Ngay cả khi muốn loại bỏ framework và chỉ dùng HTML và CSS đơn giản, khi số lượng trang tăng lên bạn vẫn phải liên tục sao chép header và footer dùng chung
  • Mỗi lựa chọn thay thế có thể nghĩ tới đều có các giới hạn riêng
    • Không tồn tại HTML import
    • Web Component cần JavaScript, và vì vậy cần JavaScript engine

Ý tưởng dùng trình duyệt như một hệ thống build

  • Trình duyệt web vốn đã hiểu nhiều định dạng như text/html, text/markdown, application/xml
  • Nếu dùng trình duyệt như một hệ thống tạo HTML từ dữ liệu, có thể xây dựng một quy trình dựa trên tiêu chuẩn web mà không cần công cụ build riêng
  • Trong quá trình tìm cách hiển thị RSS feed đẹp hơn, tác giả phát hiện rằng có thể dùng XSLT như stylesheet cho tài liệu XML
  • XML trông giống HTML nhưng là một cách biểu diễn dữ liệu không chỉ giới hạn trong dữ liệu web, có thể xem tại XML spec

Cách chuyển đổi từ XML sang HTML

  • Tài liệu XML có thể chứa dữ liệu như bài viết blog
<?xml version="1.0"?>
<blog>
  <post id="42" publishedAt="2025-06-26">
    <title>Hello XSLT</title>
    <tags>…</tags>
  </post>
</blog>
  • Có thể thêm khai báo liên kết stylesheet XSL vào tài liệu XML
<?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>
  • Template XSLT nhận đầu vào XML và xuất ra cấu trúc HTML
<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>
  • Có thể xem XSLT như dạng (XML) => HTML, đồng thời nó cung cấp các tính năng của hệ thống build như vòng lặp, biến và import
  • Dữ liệu từ tài liệu XML cha có thể được lấy vào XSLT và xuất ra một cách động
<head>
  <xsl:value-of select="title" /> | Blog
</head>

Cách chạy và triển khai

  • Có thể mở file XML trong trình duyệt để chạy phép biến đổi XSLT
open blog.xml -a Safari
  • Mọi trình duyệt web đều hỗ trợ biến đổi XSLT khi truy cập trang và hiển thị HTML kết quả
  • Cách này hoạt động giống như một hệ thống build phía client chạy trên máy người dùng
  • Việc triển khai file tĩnh rất đơn giản và hoạt động mà không cần JavaScript

Giới hạn và vị trí của nó

  • Dữ liệu blog phải được lưu dưới dạng XML thay vì JSON, nhưng XML trông giống HTML, dễ parse, linh hoạt và được web hỗ trợ native
  • Cách tiếp cận bằng XSLT không hoàn hảo và không thay thế được mọi thứ
  • Bằng cách tận dụng các tiêu chuẩn web, đặc tả và tính năng trình duyệt cũ, đây có thể trở thành một công cụ khác để tạo các website tĩnh đơn giản

1 bình luận

 
GN⁺ 2025-06-28
Ý kiến trên Hacker News
  • Tôi từng làm ở một công ty dùng XSLT rất nhiều trong các template XML, và trải nghiệm không tốt, nếu có thể chắc tôi đã chuyển đi
    Dù đã có các tiêu chuẩn mới, XSLT 1.0 vẫn còn chiếm ưu thế, trong khi nó hạn chế và kỳ quặc hơn nhiều so với các tiêu chuẩn hiện đại
    Giải quyết vấn đề hiệu năng của template XSLT gần như là địa ngục. Đây là một ngôn ngữ kiểu hàm hoàn chỉnh Turing nhưng hiệu năng lại bị trừu tượng hóa quá nhiều, nên những template chạy ổn với hầu hết tài liệu đôi khi lại nổ tung chỉ vì một bảng 100 dòng. Cuối cùng mới phát hiện template xử lý bảng có độ phức tạp O(N^2) trở lên, và XPath cho từng dòng cũng có thể lại là O(N) trở lên, nên cũng không có hướng tối ưu nào thật rõ ràng. Nếu nhớ không nhầm, có tài liệu mất hơn 7 phút để xử lý bằng XSLT
    JS chắc cũng có vấn đề khác, nhưng không giải quyết được bài toán độ phức tạp thuật toán thì không phải một trong số đó

    • XSLT/XPath đã phát triển kể từ sau XSLT 1.0
      Giờ đây có các tính năng như key (chỉ mục) có thể tăng tốc xử lý rất đáng kể, và những implementation XSLT tốt như Saxon cũng giúp rõ rệt về mặt hiệu năng
      Khi chuyển đổi XML sang định dạng khác, XSLT khá tiện vì có thể tổ chức logic rất tốt
    • Tôi không rõ chuyện “XSLT 1.0 vẫn còn chiếm ưu thế” đến từ đâu
      Tôi dùng XSLT khá nhiều vào năm 2013, và khi đó 1.0 đã gần như chết hẳn ở mọi nơi tôi thấy. Saxon miễn phí cho XSLT 2 và rất xuất sắc
      Tôi đã chuyển đổi cả tài liệu khổng lồ lẫn số lượng lớn tài liệu nhỏ mà không gặp bất kỳ vấn đề hiệu năng nào
    • XSLT không hề dễ. Nếu ví von thì nó giống Prolog sau khi ăn nấm gây ảo giác, và đường cong học tập rất dốc
      Khi đã nắm được thì nó mang lại cảm giác thỏa mãn như vừa giải xong Sudoku, nhưng thông thường chỉ cần những công cụ đơn giản hơn nhiều để đạt mục tiêu, nên khó trở thành cách tiếp cận tiêu chuẩn cho build hay template
      Hơn nữa XML cũng không phải định dạng mà ai cũng thích
    • XSLT có vẻ được tạo ra trong thời kỳ mà việc xử lý XML nguồn rất dài là điều hiển nhiên, nhưng chuyện vòng lặp lồng nhau bùng nổ thì trông quá dễ đoán nên thấy khá lạ
    • Tôi tò mò không biết có đang dùng bản thương mại của Saxon không. Nó không đắt, và với các tính năng được hỗ trợ cùng hiệu năng thì tôi thấy rất đáng tiền
      Nếu nhớ đúng thì nó còn có vài tối ưu hóa khá thông minh
  • Có thể đây là suy đoán hơi quá đà, nhưng vào thập niên 1990~2000, các trình duyệt hoạt động rất khác nhau nên người ta bắt đầu dùng JS để tạo ra cùng một hành vi, trong khi thứ thật sự cần là CSS tốt và hành vi nhất quán
    Theo thời gian, các trình duyệt bắt đầu hoạt động giống nhau hơn, nhưng lúc đó mọi người đã quen với các framework giúp trang trông giống nhau trên mọi trình duyệt, và rồi chuyển sang mô hình render dữ liệu JSON
    Với trình độ công nghệ hiện nay, trang web kiểu cũ do server tạo ra hoàn toàn đủ sức đáp ứng, lại nhẹ hơn, nhanh hơn và dùng ít bộ nhớ hơn
    Gần đây khi di chuyển một hệ thống legacy, tôi thấy kiểu kiến trúc những năm 2000 là “mỗi request HTTP tương ứng một trang”, và dù mọi thao tác như thêm/xóa đều cần refresh, nó vẫn nhanh hơn hẳn hệ thống React. Internet đã nhanh hơn, bộ nhớ điện thoại đang bị các JS framework lãng phí, còn backend thì vẫn chủ yếu là CRUD, phân trang và transaction

    • AJAX và cập nhật DOM không xuất hiện chỉ để làm mọi thứ “nhanh hơn”, mà là để thay đổi mô hình website/tài liệu web vốn chỉ hiển thị tài liệu
      Với những nơi đơn giản như HN, refresh toàn bộ trang là phù hợp, và cũng có rất nhiều trường hợp chỉ cần website đơn giản thay vì JS framework
      Nhưng không đúng khi nói rằng mọi thứ đều có thể quay lại refresh toàn bộ trang. Có những web application thực sự mà refresh toàn bộ trang sẽ tạo ra trải nghiệm người dùng rất tệ
      Nhìn chung, website, tài liệu web và form web có thể hoạt động với refresh toàn trang, nhưng điều đó không phù hợp với các web application cần hiển thị và thao tác những thứ phức tạp
    • Tôi nghĩ dòng thời gian đó không đúng. JS ban đầu được dùng vì tính tương tác, hơn là để chuẩn hóa hành vi, và DHTML rồi sau đó là AJAX là ví dụ cho điều đó
      Thời đó người ta dựa vào việc phát hiện user agent và đủ loại quirks theo thứ tự để canh layout, và tôi cũng không nghĩ JS khi ấy dễ tiếp cận các thành phần liên quan đến layout đến vậy
      CSS cũng không mang lại tính nhất quán ngay lập tức. Ngay cả khi đã đủ tính năng, nó vẫn là một mớ hỗn độn; đó là thời mà mọi người trầm trồ trước CSS Zen Garden nhưng code thực tế vẫn viết bằng table
      Tôi cũng không chắc framework có ảnh hưởng lớn đến chuyện “ngoại hình nhất quán” hay không. Đến lúc rời khỏi jQuery thì CSS đã là thứ đảm nhiệm phần ngoại hình rồi
    • Với stack .NET/Kestrel/SQLite, có thể tạo phản hồi server-side rendering trong tối đa khoảng 4 mili giây. Ở bản build phát hành, thời gian phản hồi trung bình nằm trong mức vài trăm micro giây
      Đây là trong điều kiện mỗi trang bắn nhiều query, đồng thời dùng khá nhiều join phức tạp để tạo ra dạng phản hồi chỉ dành cho view. Nếu lấy dữ liệu đúng hình dạng trước khi nội suy vào chuỗi HTML thì sẽ giúp hiệu năng rất nhiều trong các tình huống biên như bảng 100 nghìn dòng
      Theo kinh nghiệm của tôi, template engine HTML và cơ sở dữ liệu càng gần nhau càng tốt. Suy cho cùng, ngay cả DOM có cấu trúc cũng chỉ là một luồng byte phải gửi tới client
      Tôi cho rằng đã hình thành một ngành công nghiệp vô nghĩa và tự mục đích khi người ta ngồi nghĩ về cách tiếp cận AST/parser tinh vi cho những thứ lẽ ra chỉ cần StringBuilder và SQL query đủ thông minh. Lập luận phản đối cuối cùng thường quy về kiểu giám sát an ninh cho rằng lập trình viên không biết dùng đúng hàm escape HTML
    • Việc nói rằng với công nghệ hiện tại có thể gánh các trang web kiểu cũ do server tạo ra thì có một ngoại lệ là kết nối Internet có độ trễ cao: https://news.ycombinator.com/item?id=44326816
  • Thật đáng tiếc khi công nghệ này trông có vẻ lỗi thời vì sự đồ sộ của XML doanh nghiệp trong thập niên 2000, và mọi người đều đổ sang JSON “gọn gàng” hơn
    XSLT và XPath đã rất trưởng thành, và đã giải quyết sẵn nhiều vấn đề mà các định dạng khác đến giờ vẫn còn gặp
    Tôi cũng có những ký ức đẹp về việc từng lạm dụng PHP stream wrapper và XSLT include
    Có thể chỉ là định kiến cũ, nhưng tôi vẫn hơi bất an khi để trình duyệt xử lý cục bộ, vì ngày xưa đó từng là một bãi mìn về tương thích

    • Dù đã cũ, tôi vẫn nhớ vài thứ “cơ bản” của XML mà JSON đến nay chưa có. Trước hết là có một tổ chức tiêu chuẩn hóa đúng nghĩa
      Những thứ như schema ở phía XML được định nghĩa tốt hơn nhiều, và có cảm giác phía JSON mất gần 10 năm mới đuổi kịp
      Công nghệ XML cuối cùng tôi thực sự đụng tới là EXI, một phương thức truyền tải biến tài liệu XML thành luồng dữ liệu nhị phân nén. Vì việc biến cấu trúc dữ liệu thành ASCII, nén lại, gửi qua HTTP rồi đổi ngược trở lại vốn khá khôi hài
      Bây giờ họ protobuf phổ biến hơn, nhưng nếu XML tiếp tục tồn tại mạnh mẽ thì có lẽ đã hình thành một thế giới các tiêu chuẩn tương thích ăn khớp với nhau. Ngược lại, giữa protobuf/gRPC và JSON API lại có một bức tường cứng, mà biết đâu điều đó lại tốt hơn
    • XML vẫn ổn. Hơi dài dòng, nhưng tôi thích độ chính xác và khả năng biểu đạt của nó hơn YAML
      XPath cũng không tệ. Khó mà nhớ hết cú pháp, nhưng chỉ cần thử nghiệm một chút là thường cũng tới được chỗ mình muốn
      Còn XSLT thì là thứ điên rồ hoàn toàn, nên bị thiêu rụi đi thì hơn
    • Trò chơi Rimworld lưu toàn bộ dữ liệu cấu hình game bằng XML, và dùng XPath cho modding, thực sự rất hay
      Với việc cho phép chỉnh sửa cục bộ tương đối ổn định cho dữ liệu, tổ hợp XML + XPath đang bị đánh giá thấp nghiêm trọng. Có lẽ vì XML mang tiếng là “lỗi thời” nên tôi hiếm thấy ở game khác, nhưng cho mục đích này thì đây là một hệ thống rất vững chắc
      https://rimworldwiki.com/wiki/Modding_Tutorials/PatchOperati...
    • XML vốn là một tập con được đơn giản hóa của SGML, nhằm truyền markup trên web và phát triển từ vựng cùng tính năng markup của trình duyệt
      Nhưng khi cơn sốt web bùng nổ, W3C và MS đã tạo ra những thứ như SOAP, WS-*, và cũng xuất hiện khá nhiều ngôn ngữ lập trình dựa trên XML, bao gồm cả XSLT
      Không nên nói điều này với người trên HN, nhưng XSLT vốn là Scheme buộc phải là XML, cùng một kiểu điên rồ như việc JavaScript phải mượn cái tên Java
    • Giá mà XPath không bắt phải gắn namespace cẩn thận vào mọi phần của mọi truy vấn thì tốt biết mấy
  • Dạo này tôi dùng XSLT để trang trí feed
    Ví dụ như https://susam.net/feed.xmlhttps://susam.net/feed.xsl

    • Nhìn cái này khiến tôi nghĩ tại sao blog lại không thể đơn giản chỉ là một RSS feed
    • Tôi lúc nào cũng quên rằng XML làm được kiểu này. Không hiểu sao nó luôn tạo cảm giác khá kỳ lạ
    • Tôi cũng làm theo cách đó: https://adithyanair.com/feed.xml
  • Một trong những dự án đầu tiên tôi nhận khi mới 19 tuổi và làm kỹ sư phần mềm chuyên nghiệp là tùy biến hai chiếc Google Search Appliance mà công ty đã mua
    Công ty tin rằng nếu có thể tìm kiếm chuyên biệt trong một kho tài liệu CIFS khổng lồ thì quy trình phát triển kinh doanh sẽ được cải thiện, và đã chi hàng trăm nghìn đô cho những rack server Dell mặt trước màu vàng chạy CentOS và kiểu Python của Google
    Khoảng năm 2011, XHTML đang thịnh hành, và GSA hoạt động bằng cách lấy kết quả tìm kiếm được backend cung cấp dưới dạng XML rồi chuyển thành XHTML bằng XSLT
    Tôi lấy template mặc định, rồi tạo ra một con quái vật kiểu cổng intranet công ty bằng các trang ứng dụng ColdFusion đã render, cùng tài nguyên và markup chôm từ StackOverflow và hướng dẫn của W3Schools
    Sau đó trên LinkedIn, nhiều nhà thầu DoD đã liên hệ mời tôi tham gia các dự án hiện đại hóa tài liệu vì thấy tôi có “chuyên môn XML”, và tôi nhanh chóng học được rằng nên bỏ kinh nghiệm này khỏi CV
    Mỗi khi bạn thở dài vì đang lặp qua một mảng interface TypeScript được deserialize từ phản hồi JSON để dựng JSX, hãy nhớ rằng trước đây tôi từng làm đúng việc đó bằng XSLT

  • Nhiều người phàn nàn rằng XML dài dòng và nhìn từ xa thì có vẻ phức tạp, nhưng điều hay là bạn có thể tạo một định dạng tệp tốt dựa trên XML, xác thực bằng DTD, rồi nếu cần thì định dạng lại bằng XSLT cho dễ đọc với con người
    XML giống như C++ của các định dạng tệp dựa trên văn bản: trưởng thành, đầy đủ pin kèm sẵn, mạnh mẽ, và nếu muốn thì có thể dùng từ bất kỳ ngôn ngữ nào
    Chuyện chê bai XML cũng đã thành mốt, giống như cách các ngôn ngữ cũ và trưởng thành bị chê vì những cái quirks riêng của chúng. Nếu không hợp với mục đích thì đừng dùng, nhưng cũng không nên coi nó là quái vật

    • Tôi thắc mắc vì sao lại dùng DTD mà không dùng XSD
  • Để thấy XML và XSLT từng đi xa đến mức nào vào đầu những năm 2000, công ty tôi từng làm việc trước đây đã chế tạo một ASIC có thể parse XML ở tốc độ đường truyền và xử lý XSLT native ngay trên chip
    Vì họ dự đoán tương lai của Internet sẽ hoàn toàn là XML/XSLT. Intel đã mua lại công ty đó, và công nghệ nội bộ của họ được đưa vào bộ tăng tốc SSE

    • Nghĩ tới việc nếu đi theo con đường đó thì các website có lẽ đã render nhanh đến mức nào
    • IBM vẫn đang bán DataPower Gateway, một phần cứng vẫn còn khá đúng với mô tả đó
  • Thật ngạc nhiên trước kiểu phép màu “XSLT chạy native trong trình duyệt”
    Lần cuối cùng tôi dùng XSLT chắc là khoảng 20 năm trước, nhưng hồi đó đã dùng rất nhiều trong vài năm. Khi ấy, để nó chạy được thì cần cả một chồng Java enterprise khổng lồ và mong manh, làm mất đi sự thanh lịch vốn có của XSLT
    Nhưng nếu XSLT thực sự chạy được trong trình duyệt, thì hóa ra chén thánh của template tĩnh có thể host ở bất cứ đâu đã luôn ở ngay trước mắt

    • Trình duyệt chỉ hỗ trợ XSLT v1.0, và tôi nghe nói từng có bàn đến chuyện loại bỏ nó
      Nếu thay vào đó có hỗ trợ v3 thì có vẻ sẽ dễ hơn nhiều để phục vụ các trang web tĩnh với hỗ trợ template native
    • Không đến mức là “chồng Java enterprise khổng lồ và mong manh”. Tôi đã dùng ổn với Tomcat và một vài thư viện Apache
      CMS xuất ra các tệp XML có nhúng HTML và cache hoạt động cực kỳ tốt. Cá nhân hóa và render HTML/JS được xử lý phía server cùng với proxy cache
      Việc biến đổi XSL chạy phía sau lớp cache và đủ nhanh để theo kịp lượng truy cập lớn. Ở đây mục đích của XML là nhét HTML đã chuẩn bị sẵn vào dưới dạng blob, và chỉ để lại những phần cần cá nhân hóa dưới dạng thẻ XML
      Bước biến đổi cuối cùng khá nhanh, và mấu chốt là đẩy đầu ra của bộ biến đổi XSL thẳng vào response output stream thay vì giữ trong một bộ đệm toàn bộ trên bộ nhớ. Với các phản hồi lớn thì đây vẫn là một kỹ thuật tốt đến tận bây giờ, nhưng nhiều framework bỏ lỡ điều này vì mặc định chọn đệm trong bộ nhớ
      Tất nhiên ngày nay có thể chạy bất cứ thứ gì muốn trong trình duyệt bằng wasm. Nhưng hồi đó JavaScript rất tệ, và nhà thiết kế giỏi lắm cũng chỉ giao cho bạn file Photoshop. Bạn phải cắt nó ra thành frame và table, và chúng tôi đang xây một CMS UI dùng khá nặng JavaScript, phải hỗ trợ cả Netscape lẫn Internet Explorer vào đúng thời Google Maps và Gmail vừa mới ra mắt
    • Năm 2008 tôi từng làm với một site dùng XSLT trong trình duyệt, và có vẻ hỗ trợ này còn ngược về tận đầu những năm 2000
    • XSLT thì chạy được, nhưng có vẻ mọi trình duyệt đều bị kẹt ở các phiên bản đặc tả cũ
      Firefox đặc biệt có một lỗi rất khó chịu: khi cần disable-output-escaping để render HTML trong tài liệu thành DOM thực sự, nó không hoạt động đúng mà lại render thành văn bản HTML thô
    • Tôi không hiểu ý nói cần một chồng Java enterprise. Tôi đã biến đổi XML trong classic ASP chỉ với khoảng ba dòng VBScript
  • Trong một dự án phản địa đàng từ rất lâu về trước, có người bi quan rằng nhóm sẽ không thể điều phối việc phát triển Java song song với các workbook thay đổi chóng mặt, nên đã đưa ra một giải pháp
    Workbook viết bằng Excel được Visual Basic chuyển thành XML, rồi các tệp XSLT sẽ tự động sinh ra các lớp Java để xử lý những Struts action được định nghĩa trong XML đó
    https://raganwald.com/2008/02/21/mouse-trap.html
    Thảo luận HN: https://news.ycombinator.com/item?id=120379 · https://news.ycombinator.com/item?id=947952