XSL và XSLT
- 19-06-2023
- Toanngo92
- 0 Comments
Mục lục
Giới thiệu về XSL
Style Sheets
Như đã thấy trong phần trước, stylesheet là một tập hợp các lệnh cho bộ xử lý (chẳng hạn như trình duyệt Web hoặc trình đọc tài liệu) cách hiển thị hình thức trực quan của nội dung trong trang Web.
Stylesheet thường chứa các hướng dẫn như:
- Đánh số thứ tự liên tục trong toàn bộ tài liệu.
- Hiển thị liên kết siêu văn bản màu xanh lam
- Định vị văn bản và hình ảnh trên một trang Web
- Tạo bố cục được tối ưu hóa cho màn hình nhỏ dành cho điện thoại di động.
Ngôn ngữ biểu định kiểu mở rộng (Estensible Style Sheet Language XSL) được phát triển bởi World Wide Web Consortium (W3C) để mô tả cách hiển thị tài liệu XML.
Ngôn ngữ biểu định kiểu mở rộng (XSL)
XSL là một ngôn ngữ dựa trên XML được sử dụng để tạo các trang syle. XSL được thiết kế để định dạng nội dung XML cho mục đích hiển thị và cũng có khả năng biến đổi hoàn toàn các tài liệu XML. XSL là một đặc điểm kỹ thuật từ World Wide Web Consortium (W3C). Đề xuất chuyển đổi XSL mô tả quá trình chuyển đổi tài liệu XML, sử dụng công cụ chuyển đổi và XSL. Tài liệu XML và biểu định kiểu XSL được cung cấp làm đầu vào cho công cụ chuyển đổi XML, còn được gọi là bộ xử lý XSLT. Đầu ra của bộ xử lý ở dạng cây kết quả trong đó các phần tử của tài liệu XML được chuyển đổi thành các nút có các giá trị và thuộc tính văn bản cụ thể. Bộ xử lý XSLT sử dụng biểu định kiểu XSL để thu thập hướng dẫn chuyển đổi tài liệu XML nguồn thành tài liệu XML đầu ra, Biểu định kiểu được sử dụng để thay đổi cấu trúc của tài liệu XML và sửa đổi đầu ra.
XSL bao gồm ba ngôn ngữ:
XSL Transformations (XSLT)
XSLT chuyển đổi một tài liệu XML thành một tài liệu XML khác mà máy tính thực sự có thể hiểu và hiển thị.
XML Path Language (XPath)
XPath được sử dụng làm bộ điều hướng cho XSL. XSL sử dụng XPath để tìm các phần của tài liệu nguồn phù hợp với một mẫu nhất định được xác định trước. Khi XPath tìm thấy node, XSLT sẽ tiếp quản và thực hiện chuyển đổi, biến tài liệu nguồn thành tài liệu kết quả.
XSL Formatting Objects (XSL-FO)
Một ngôn ngữ XML để định dạng tài liệu XML. Sau khi XPath đã tìm kiếm thông qua tài liệu nguồn và sử dụng XSLT để chuyển đổi tài liệu nguồn thành tài liệu kết quả, tài liệu sau đó cần được định dạng để trình duyệt Web có thể trình bày tài liệu với bố cục và cấu trúc phù hợp. Nói một cách đơn giản, XSL-FO là một phần của XSL tạo ra đầu ra cuối cùng.
XSL Transformations
Thành phần chuyển đổi của công nghệ biểu định kiểu XSL là XSLT. Mục đích của nó là chuyển đổi các tài liệu XML. Nó mô tả quá trình chuyển đổi một tài liệu XML, sử dụng một công cụ chuyển đổi và XSL. Tài liệu XML và biểu định kiểu XSL được cung cấp làm đầu vào cho công cụ chuyển đổi XML, còn được gọi là bộ xử lý XSLT. Đầu ra của bộ xử lý ở dạng cây kết quả trong đó các phần tử của tài liệu XML được chuyển đổi thành các nút có các giá trị và thuộc tính văn bản cụ thể.
Lưu ý: Bạn có thể chuyển đổi tài liệu XML thành bất kỳ định dạng dựa trên văn bản nào, Bao gồm HTML, văn bản thuần túy hoặc lược đồ XML khác bằng cách sử dụng XSLT.
Bộ xử lý XSLT là một ứng dụng kết nối tài liệu XML với biểu định kiểu XSLT. Việc chuyển đổi tài liệu XML ở dạng cây node, có thể được hiển thị dưới dạng đầu ra hoặc được gửi để chuyển đổi thêm.
Mô hình xử lý XSL
Bộ xử lý XML đọc một tài liệu XML và xử lý nó thành một cây phân cấp có chứa các nút cho từng phần thông tin trong tài liệu. Sau khi tài liệu đã được xử lý thành cây, bộ xử lý XSL bắt đầu áp dụng các quy tắc của style sheet XSL cho cây tài liệu.
Để gọi file xsl vào xml, sử dụng cú pháp:
<?xml-stylesheet type="text/xsl" href="filename.xsl"?>
Bộ xử lý XSL bắt đầu với node gốc trong cây và thực hiện khớp mẫu trong biểu định kiểu. Các mẫu này được lưu trữ trong các cấu trúc được gọi là mẫu trong style sheet XSL. Bộ xử lý XSL phân tích các mẫu và các mẫu được liên kết với chúng để xử lý các phần khác nhau của cây tài liệu. Khi khớp được thực hiện, phần của cây khớp với mẫu nhất định sẽ được xử lý bởi mẫu biểu định kiểu phù hợp. Tại thời điểm này, các quy tắc của mẫu được áp dụng cho nội dung để tạo cây kết quả. Bản thân cây kết quả là một cây dữ liệu và dữ liệu đã được biến đổi bởi biểu định kiểu.
Cấu trúc và cú pháp XSLT
Trong XSL, các quy tắc kiểu được ghi trong một tệp có phần mở rộng .xsl. Tệp này được liên kết với một tài liệu XML bằng cách sử dụng câu lệnh . Ở đây, xml-stylesheet là hướng dẫn xử lý.
Cú pháp:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- ... -->
</xsl:stylesheet>
Trong đó:
<xsl:stylesheet>: Phần tử gốc của stylesheet
xmlns:xsl=”http://www.w3.org/1999/XSL/transform”: đề cập đến namespace W3C XSLT chính thức. Bạn phải bao gồm thuộc tính version=”1.0″ nếu bạn sử dụng namespace này.
Namespace XSLT phải được khai báo ở đầu tài liệu để có quyền truy cập vào các thành phần, thuộc tính và tính năng XSLT.
Lưu ý: Phần tử <xsl:transform> giữ giá trị cú pháp giống như <xsl:stylesheet>. <xsl:transform> và <xsl:stylesheet> hoàn toàn đồng nghĩa và có thể được sử dụng. Phần tử xsl: stylesheet được sử dụng phổ biến hơn phần tử xsl:transform.
Phần tử XSLT cấp cao nhất
Các phần tử XSLT cấp cao nhất có thể xuất hiện trực tiếp bên trong phần tử xsl:stylesheet. Phần tử xuất hiện dưới dạng phần tử con của phần tử xsl:stylesheet được gọi là phần tử cấp cao nhất. Các phần tử này cung cấp các khối xây dựng để tạo tài liệu XSLT.
Các phần tử cấp cao nhất trong cú pháp XSLT được liệt kê trong bảng bên dưới. Các phần tử này có thể xuất hiện trực tiếp Bên trong các phần tử xsl:stylesheet hoặc xsl:transform.
Phần tử | Mô tả |
xsl:decimal-format | Xác định định dạng thập phân mặc định cho chuyển đổi số thành văn bản. |
xsl:include | Được sử dụng để đưa một style sheet vào một style sheet khác. |
xsl:key | Xác định một khóa đã đặt tên sẽ được sử dụng với hàm key() để thao tác trên các mẫu và biểu thức. |
xsl:output | Xác định định dạng của output được tạo bởi style sheet |
xsl:preserve-space | Xác định định dạng của đầu ra được tạo bởi style sheet. |
Phần tử xsl:decimal-format
Cú pháp:
<xsl:decimal-format decimal-seperator="character" digit="character" grouping-separator="character" infinity="string" minus-sign="character" name="name" NaN="string" pattern-separator="character" percent="character" per-mille="character" zero-digit="character" />
Trong đó:
decimal-separator=”character”: Xác định ký tự được sử dụng để phân tách phần Số nguyên và phần phân số của một số. Mặc định là dấu chấm (.).
digit=”character”: Xác định ký tự được sử dụng để biểu thị rằng một chữ số là cần thiết trong một mẫu định dạng. Hàm băm (#) là mặc định.
grouping-separator=”character”: Xác định ký tự được sử dụng để phân tách các nhóm chữ số. Mặc định là dấu phẩy (,).
infinity=”string”: Xác định chuỗi được sử dụng để biểu thị giá trị vô hạn. Mặc định là chuỗi, “infinity”
minus-sign=”character”: Xác định ký tự được sử dụng để biểu thị dấu trừ. Mặc định là dấu gạch nối (-)
NaN=”string”: Xác định chuỗi được sử dụng để chỉ ra rằng giá trị không phải là số. Mặc định là chuỗi, “NaN”.
pattern-separator=”character”: Xác định ký tự được sử dụng để phân tách các mẫu phụ dương và âm trong một mẫu định dạng. Mặc định là dấu chấm phẩy (;)
percent=”character”: Xác định ký tự được sử dụng để biểu thị dấu phần trăm. Mặc định là dấu phần trăm (%).
per-mille=”character”: Xác định ký tự được sử dụng để biểu thị dấu phần nghìn. Giá trị mặc định là Unicode trên mỗi ký tự mille (%).
zero-digit=”character”: Xác định ký tự được sử dụng để biểu thị chữ số 0.Mặc định là (0).
Ví dụ về đoạn mã mô tả cú pháp trên:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:decimal-format name="name" digit="D" />
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<body>
<xsl:value-of select='format-number(45665789, "#.000")' />
<xsl:value-of select='format-number(0.3456789, "###%")' />
<xsl:value-of select='format-number(789, "D.0", "name")' />
<xsl:value-of select='format-number(123456789, "$DDD,DDD,DDD.DD", "name")' />
<xsl:value-of select='format-number(193 div 200, "###.#%")'/>
<xsl:value-of select='format-number(a div 0, "###,###.00")'/>
<xsl:value-of select='format-number(1 div 0, "###,###.00")'/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Khi lấy dữ liệu ra, với cấu trúc tài liệu này sẽ trả về các giá trị 45665789.000, 35%, 789,0, $123,456,789, 96,5%, NaN và Infinity tương ứng.
Phần tử xs:include
Cú pháp:
<xsl:include href="uri"/>
Trong đó, href=”uri”:Địa chỉ Mã định danh tài nguyên thống nhất xác định tệp XSLT được đưa vào.
Ví dụ:
Tạo file books.xml
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book>
<title>Introduction to XSLT</title>
<author>John Doe</author>
<genre>Programming</genre>
</book>
<book>
<title>Data Science Basics</title>
<author>Jane Smith</author>
<genre>Science</genre>
</book>
<book>
<title>Web Development Fundamentals</title>
<author>Bob Johnson</author>
<genre>Programming</genre>
</book>
</library>
Tạo file Main.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="Common.xsl" />
<xsl:template match="/">
<html>
<head>
<title>Main Document</title>
</head>
<body>
<h1>Main Content</h1>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Tạo file Common.xsl
<!-- Common.xsl -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="title">
<h2><xsl:value-of select="." /></h2>
</xsl:template>
<xsl:template match="author">
<p>Author: <xsl:value-of select="." /></p>
</xsl:template>
</xsl:stylesheet>
Phần tử xsl:key
Cú pháp:
<xsl:key match="pattern" name="qname" use="expression">
</xsl:key>
Trong đó:
match=”pattern”: Xác định các node mà khóa sẽ được áp dụng.
name=”qname”: Chỉ định tên đủ điều kiện (qualified name) của khóa.
use=”expression”: Được sử dụng để xác định giá trị của khóa cho mỗi node
Ví dụ:
Tạo file staffs.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="key.xsl"?>
<APTstaff>
<Developer name="David Blake" address="B-602" phone="567-877-9766"/>
<Developer name="Roger Blake" address="B-345" phone="345-865-9777"/>
</APTstaff>
Tạo file key.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="staflist" match="Developer" use="@name"/>
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="key('staflist', 'David Blake')">
<p>
NAME: <xsl:value-of select="@name"/><br/>
ADDRESS: <xsl:value-of select="@address"/><br/>
PHONE: <xsl:value-of select="@phone"/>
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Kết quả khi thực hiện sẽ là:
NAME: David Blake ADDRESS: B-602, East West Coast PHONE: 567-877-9766
Ví dụ 2:
Tạo file books.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="books.xsl"?>
<library>
<book>
<title>Introduction to XSLT</title>
<author>John Doe</author>
<genre>Programming</genre>
</book>
<book>
<title>Data Science Basics</title>
<author>Jane Smith</author>
<genre>Science</genre>
</book>
<book>
<title>Web Development Fundamentals</title>
<author>Bob Johnson</author>
<genre>Programming</genre>
</book>
</library>
Tạo file books.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Define a key to group books by genre -->
<xsl:key name="genreKey" match="book" use="genre" />
<xsl:template match="/">
<html>
<body>
<h2>Books Grouped by Genre</h2>
<xsl:apply-templates select="//book[generate-id() = generate-id(key('genreKey', genre)[1])]"/>
</body>
</html>
</xsl:template>
<!-- Template to process each unique genre -->
<xsl:template match="book">
<h3><xsl:value-of select="genre" /></h3>
<ul>
<xsl:for-each select="key('genreKey', genre)">
<li><xsl:value-of select="title" /> - <xsl:value-of select="author" /></li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>
Phần tử xsl:output
Cú pháp:
<xsl:output cdata-section-elements="namelist" doctype-public="string" doctype-system="string" encoding="string" indent="yes" | "no" media-type="mimetype" method="html" | "name" | "text" | "xml" omit-xml-declaration="yes" | "no" standalone="yes" | "no" version="version_number" />
Mô tả chi tiết thuộc tính:
Thuộc tính | Mô tả |
cdata-section-elements | Không bắt buộc. Một danh sách các thành phần được phân cách bằng khoảng trắng có nội dung văn bản, nên được viết dưới dạng các phần CDATA. |
doctype-public | Tùy chọn. Chỉ định các mã định danh công khai đi trong khai báo kiểu tài liệu. |
doctype-system | Tùy chọn. Chỉ định các mã định danh hệ thống đi vào khai báo loại tài liệu. |
encoding | Tùy chọn. Đặt giá trị của thuộc tính mã hóa trong đầu ra. |
indent | Tùy chọn. Chỉ định có thụt lề đầu ra hay không. Nếu được đặt thành “có”, đầu ra XML và HTML được thụt vào từng bước để dễ đọc hơn. |
media-type | Tùy chọn. Xác định loại MIME của đầu ra. Mặc định là “văn bản/xml” |
method | Tùy chọn. Xác định loại đầu ra. Ba giá trị được phép là HTML, văn bản và XML. Mặc định là XML. Tuy nhiên, nếu phần tử con đầu tiên của node gốc là thẻ HTML và không có nút văn bản nào ở trước node, thì loại đầu ra mặc định được đặt thành HTML. |
omit-xml-declaration | Không bắt buộc. Giá trị “yes” chỉ định rằng nên bỏ qua khai báo XML (<?xml ?>) trong đầu ra. “no” chỉ định rằng nên bao gồm khai báo XML trong đầu ra. Mặc định là “no” |
standalone | Chỉ định liệu bộ xử lý XSLT có xuất ra một khai báo độc lập hay không. Có chỉ định rằng một sự suy giảm độc lập sẽ xảy ra trong đầu ra. Không, mặc định, biểu thị rằng một khai báo độc lập sẽ xuất hiện trong đầu ra. |
version | Tùy chọn. Cung cấp số phiên bản W3C cho định dạng đầu ra. Nếu đầu ra là XML, phiên bản mặc định là 1.0. Hoặc nếu loại đầu ra là HTML, phiên bản mặc định là 4.0. |
Ví dụ:
Tạo file input.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="output_example.xsl"?>
<library>
<book>
<title>Introduction to XSLT</title>
<author>John Doe</author>
<genre>Programming</genre>
</book>
<book>
<title>Data Science Basics</title>
<author>Jane Smith</author>
<genre>Science</genre>
</book>
</library>
Tạo file output_example.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Define the output characteristics -->
<xsl:output method="html" indent="yes" />
<!-- Start the transformation -->
<xsl:template match="/">
<html>
<head>
<title>Book List</title>
</head>
<body>
<h1>Books</h1>
<ul>
<!-- Apply templates to process book elements -->
<xsl:apply-templates select="//book" />
</ul>
</body>
</html>
</xsl:template>
<!-- Template to process each book element -->
<xsl:template match="book">
<li>
<strong>Title:</strong> <xsl:value-of select="title" /><br />
<strong>Author:</strong> <xsl:value-of select="author" /><br />
<strong>Genre:</strong> <xsl:value-of select="genre" />
</li>
</xsl:template>
</xsl:stylesheet>
Phần tử xsl:preserve-space
Cú pháp:
<xsl:preserve-space elements="names" />
Trong đó:
elements: Chỉ định danh sách các tên phần tử được phân tách bằng khoảng trắng mà khoảng trắng sẽ được giữ nguyên hoặc xóa.
Ví dụ:
Tạo file input.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="preserve_space_example.xsl"?>
<document>
<paragraph>
This is a paragraph with
multiple lines.
</paragraph>
</document>
Tạo file preserve_space_example.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Specify that whitespace in the source document should be preserved for the 'paragraph' element -->
<xsl:preserve-space elements="paragraph" />
<!-- Start the transformation -->
<xsl:template match="/">
<html>
<head>
<title>Preserve Space Example</title>
</head>
<body>
<h1>Transformed Content</h1>
<!-- Apply templates to process 'paragraph' elements -->
<xsl:apply-templates select="//paragraph" />
</body>
</html>
</xsl:template>
<!-- Template to process 'paragraph' elements -->
<xsl:template match="paragraph">
<p>
<strong>Content:</strong> <xsl:value-of select="." />
</p>
</xsl:template>
</xsl:stylesheet>
CSS và XSL
XSL và CSS là hai ngôn ngữ kiểu khác nhau được World Wide Web Consortium (W3C) khuyến nghị. XSL mạnh hơn và phức tạp hơn CSS. Một số khác biệt giữa CSS và XSL được liệt kê trong bảng:
CSS | XSL |
Ngôn ngữ biểu định kiểu để tạo kiểu cho tài liệu HTML và tài liệu XML | Ngôn ngữ biểu định kiểu để tạo kiểu cho XML |
Xác định giao diện trực quan của trang, nhưng không thay đổi cấu trúc của tài liệu nguồn | Cung cấp phương tiện chuyển đổi tài liệu XML |
Không hỗ trợ cấu trúc quyết định và nó không thể tính toán số lượng hoặc lưu trữ giá trị trong biến | Hỗ trợ các cấu trúc quyết định và có thể tính toán số lượng hoặc lưu trữ giá trị trong các biến |
Sử dụng ký hiệu riêng của nó | Sử dụng ký hiệu XML |
Hiệu quả cao và dễ học cho các ứng dụng đơn giản | Được thiết kế để đáp ứng nhu cầu của các ứng dụng phức tạp hơn cho các biểu định kiểu phong phú hơn |
Làm việc với XSL
XSL Templates
Mẫu (Template) là thành phần chính của biểu định kiểu. Các mẫu được xác định với sự trợ giúp của các quy tắc. Quy tắc mẫu được sử dụng để kiểm soát đầu ra của bộ xử lý XSLT. Nó định nghĩa phương pháp mà theo đó một nút phần tử XML được chuyển đổi thành một nút phần tử XSL. Quy tắc mẫu bao gồm một mẫu Xác định node XML và một hành động chọn và chuyển đổi node.
Mỗi quy tắc mẫu được đại diện bởi phần tử xsl:template. xsl:template là một thành phần xác định một hành động để tạo đầu ra từ một tài liệu nguồn.
Các quy tắc template dựng sẵn như sau:
Quy tắc mẫu dựng sẵn cho các chế độ: Đảm bảo rằng các phần tử và gốc trong bất kỳ chế độ nào đều được xử lý.
<xsl:template match="*|/" mode="x">
<xsl:apply-templates mode="x"/>
</xsl:template>
Quy tắc mẫu dựng sẵn cho phần tử và node gốc: Xử lý nút gốc và node con của nó. Các quy tắc mẫu tích hợp cho phần tử và nút gốc như sau:
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
Lưu ý *|/ là cấu trúc xpath
Xem thêm các toán tử XPATH tại link: XPath trong XML – Web888 chia sẻ kiến thức lập trình, kinh doanh, mmo
Hoặc xem thêm tại link: https://stackoverflow.com/questions/3127108/xsl-meaning-of-match-for-xsltemplate
Quy tắc mẫu dựng sẵn cho các node thuộc tính và văn bản: Sao chép các node thuộc tính và văn bản vào cây kết quả. Các quy tắc mẫu dựng sẵn sẵn cho các node thuộc tính và văn bản như sau:
<xsl:template match="text() | @*">
<xsl:value-of select="." />
</xsl:template>
Quy tắc mẫu dựng sẵn cho các node hướng dẫn bình luận và xử lý: Không thực hiện bất kỳ chức năng nào. Nó được áp dụng cho các nhận xét và hướng dẫn xử lý trong tài liệu XML. Các quy tắc mẫu dựng sẵn cho các node hướng dẫn nhận xét và xử lý như sau:
<xsl:template match="comment()|processing-instruction()" />
Quy tắc mẫu dựng sẵn cho node namespace: Không thực hiện bất kỳ chức năng nào. Nó được áp dụng cho namespace node trong tài liệu XML. Quy tắc mẫu dựng sẵn cho namespace node như sau:
<xsl:template match="namespace()" />
Lưu ý: Quy tắc dựng sẵn có mức độ ưu tiên thấp hơn các quy tắc mẫu khác.
Trong khi duyệt qua một tài liệu XML, các quy tắc mẫu được kích hoạt theo thứ tự mà chúng khớp với các phần tử. Một mẫu có thể thay đổi thứ tự truyền tải và nó cũng có thể ngăn không cho các phần tử cụ thể được xử lý. Phần tử xsl:apply-templates cho phép người dùng chọn thứ tự duyệt tài liệu.
Ví dụ: xét một phần tử Order có các phần tử con là OrderNunber, ItemInfo và Price. Phần tử ItemInfo có thêm các phần tử con là Name và Quantity. Phần tử ItemName xuất hiện trước phần tử Quantity trong cấu trúc cây.
Để có được đầu ra trong đó Quantity được hiển thị trước ItemName, có thể sử dụng mẫu sau:
<xsl:template match="ItemInfo">
<xsl:value-of select="Quantity"/>
<xsl:value-of select="ItemName"/>
</xsl:template>
Phần tử xsl:template
Phần tử xsl:template được sử dụng để xác định một mẫu có thể được áp dụng cho một node để tạo đầu ra mong muốn.
Thuộc tính match trong xsl:template được sử dụng để liên kết mẫu với một phần tử XML. Bạn cũng có thể xác định mẫu cho toàn bộ nhánh của tài liệu XML bằng cách sử dụng thuộc tính match (ví dụ: match=”/” xác định toàn bộ tài liệu XML)
Cú pháp:
<xsl:template match="pattern" mode="mode" name="name" prioprity="number">
</xsl:template>
Trong đó:
match: Là một mẫu được sử dụng để xác định các node nào sẽ áp dụng quy tắc mẫu nào cho chúng. Nếu thuộc tính này bị bỏ qua thì phải có thuộc tính name.
mode: Cho phép các node giống nhau được xử lý nhiều lần.
name: Chỉ định tên cho mẫu. Nếu thuộc tính này bị bỏ qua thì phải có thuộc tính đối sánh.
priority: Là một số thực đặt mức độ quan trọng ưu tiên cho một mẫu. Con số càng cao, mức độ ưu tiên càng cao.
Cú pháp của một số mẫu đối sánh được trình bày như sau:
<xsl:template match =”/”> đại diện cho phần tử gốc trong tài liệu XML, <xsl:template match = “name of the element” > đại diện cho tất cả các phần tử trong tài liệu XML có tên được chỉ định, <xsl:template match =parent1/child > đại diện cho phần tử con bằng cách chỉ định chính xác phần tử cha và <xsl:template match=”/ | *”> khớp với toàn bộ tài liệu.
Ví dụ mô tả:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h1>My CD Collection</h1>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Bản thân biểu định kiểu XSL là một tài liệu XML, nó luôn bắt đầu bằng khai báo XML: <?xml version=”1.0″ ?>
Phần tử tiếp theo, <xsl:stylesheet> xác định rằng tài liệu này là tài liệu biểu định kiểu XSLT. Nó cũng chứa các thuộc tính namespace XSLT và số phiên bản.
Phần tử <xsl:template> xác định một mẫu, Thuộc tính match=”/” liên kết mẫu với thư mục gốc của tài liệu nguồn XML.
Nội dung bên trong phần tử <xsl:template> xác định một số HTML để ghi vào đầu ra.
Hai dòng cuối cùng xác định phần cuối của mẫu và phần cuối của style sheet.
Phần tử xsl:apply-templates
Phần tử xsl:apply-templates xác định một tập hợp các node sẽ được xử lý. Theo mặc định, phần tử này chọn tất cả các node con của nút hiện tại đang được xử lý và tìm quy tắc mẫu phù hợp để áp dụng cho từng node trong tập hợp.
Cú pháp:
<xsl:apply-templates select="expression" mode="name" />
Trong đó:
select: Được sử dụng để xử lý các nút được chọn bởi một biểu thức.
mode: Cho phép các node giống nhau được xử lý nhiều lần. Mỗi khi các node được xử lý, chúng có thể được hiển thị theo một cách khác.
Ví dụ xét file XML sau: đây là file xml mô tả một danh sách đối tượng với phần tử gốc là GEMEmployees
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="Employees.xsl"?>
<GEMEmployees>
<Designer>
<Name>David Blake</Name>
<Title>Senior Designer</Title>
<Address>512-B Laming Road</Address>
<Phone>1564-574-111</Phone>
</Designer>
<Designer>
<Name>Toanngo92</Name>
<Title>Web Developer</Title>
<Address>6/203 Truong Chinh</Address>
<Phone>1564-574-112</Phone>
</Designer>
</GEMEmployees>
Ví dụ file stylesheet tương ứng với file XML trên:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="GEMEmployees/Designer">
<html>
<body>
<div class="wrapper">
<xsl:apply-templates select="Name" />
<xsl:apply-templates select="Address" />
<br />
</div>
</body>
</html>
</xsl:template>
<xsl:template match="Name"> Name: <strong style="color: red;">
<xsl:value-of select="." />
</strong>
</xsl:template>
<xsl:template match="Address"> Address: <strong style="color: green">
<xsl:value-of select="." />
</strong>
</xsl:template>
</xsl:stylesheet>
Output:
Trong đó:
match=”GEMEmployees/Designer” : Đại diện cho phần tử con Designer bằng cách chỉ định phần tử cha GEMEmployees.
xsl:apply-templates select=”Name” : Áp dụng mẫu trên thành phần Name
xsl:template match=”Address”: Áp dụng mẫu trên thành phần Address
xsl:template match=”Name” : Nếu mẫu khớp với phần tử Địa chỉ, giá trị của phần tử Name được hiển thị bằng màu đỏ.
xsl:value-of : Được sử dụng để trích xuất giá trị của một node được chọn.
Thuộc tính select
Thuộc tính select có thể được sử dụng để xử lý các nút được chọn bởi một biểu thức thay vì xử lý tất cả các node con, xsl:apply-templates với thuộc tính select có thể được sử dụng để chọn một tập hợp cụ thể
của node con thay vì tất cả node con.
Cú pháp:
<xsl:template match="element">
<xsl:apply-templates select="name_of_element" />
</xsl:template>
Phần tử xsl:value-of
Phần tử xsl:value-of được sử dụng để ghi hoặc hiển thị trong cây kết quả một chuỗi văn bản biểu thị giá trị của phần tử được chỉ định bởi thuộc tính select. Phần tử xsl:value-of chỉ có thể có một node được gán cho nó.
Cú pháp:
<?xsl:value-of select="expression" disable-output-escaping="yes" | "no" />
Trong đó:
select : Thuộc tính bắt buộc gán node (theo tên) cho phần tử.
disable-output-escaping : Chỉ định cách các ký tự đặc biệt sẽ xuất hiện trong chuỗi đầu ra.
- Giá trị yes : Cho biết rằng các ký tự đặc biệt sẽ được hiển thị nguyên trạng (ví dụ: < hoặc >).
- Cho biết rằng các ký tự đặc biệt không được hiển thị nguyên trạng (ví dụ: dấu > được hiển thị dưới dạng >).
Ví dụ file xml biểu diễn những đối tượng Person trong thẻ gốc House:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="person.xsl" type="text/xsl"?>
<House>
<Person>
<FirstName age="20">David</FirstName>
<LastName>Blake</LastName>
</Person>
<Person>
<FirstName age="320">Toan</FirstName>
<LastName>Ngo</LastName>
</Person>
</House>
File xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="House/Person">
<html>
<body>
<p>
<xsl:value-of select="FirstName" /> - <xsl:value-of select="LastName" />
</p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Phần tử xsl:for-each
Phần tử xsl:for-each có thể được sử dụng để lặp qua các phần tử XML của một tập hợp nút được chỉ định. Nó áp dụng một mẫu lặp đi lặp lại cho mỗi node trong một tập hợp.
Cú pháp:
<xsl:for-each select="expression"></sxl:for-each>
Ví dụ code mẫu sau:
Tạo file employees.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="employees.xsl" type="text/xsl"?>
<Employees>
<Employee>
<Name>Toan123</Name>
<Department>Marketing</Department>
<Language>EN</Language>
<Salary>$1000</Salary>
</Employee>
<Employee>
<Name>Helloworld</Name>
<Department>Developer</Department>
<Language>VI</Language>
<Salary>$1200</Salary>
</Employee>
<Employee>
<Name>Emp3</Name>
<Department>CTO</Department>
<Language>RU</Language>
<Salary>$1500</Salary>
</Employee>
</Employees>
Tạo file employees.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:template match="Employees">
<html>
<body>
<h1>Employees</h1>
<table border="1">
<tr>
<th>Name</th>
<th>Deparment</th>
<th>Language</th>
<th>Salary</th>
</tr>
<xsl:for-each select="Employee">
<tr>
<td>
<xsl:value-of select="Name" />
</td>
<td>
<xsl:value-of select="Department" />
</td>
<td>
<xsl:value-of select="Language" />
</td>
<td>
<xsl:value-of select="Salary" />
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Output:
Phần tử xsl:text
Phần tử xsl:text được sử dụng để thêm văn bản vào đầu ra. Phần tử này không thể chứa bất kỳ phần tử XSL nào khác. Nó chỉ có thể chứa văn bản.
Cú pháp:
<xsl:text disable-output-escaping="yes" | "no"></xsl:text>
Trong đó:
disable-output-escaping : Bật hoặc tắt khả năng thoát khỏi các ký tự đặc biệt.
yes : Nếu giá trị là yes, > sẽ xuất hiện dưới dạng dấu >.
no : Nếu giá trị là no, > sẽ xuất hiện như một dấu đóng thẻ trong văn bản (output ra html)
Ví dụ đoạn mã XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="orders.xsl" type="text/xsl"?>
<Orders>
<Item>
<Name>Laptop Dell</Name>
<Price>$45000</Price>
<ShippingDate>10-Mar-07</ShippingDate>
</Item>
<Item>
<Name>Laptop Lenovo</Name>
<Price>$10000</Price>
<ShippingDate>10-Mar-07</ShippingDate>
</Item>
</Orders>
Tạo file orders.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:template match="/">
<html>
<body>
<xsl:text>
Your order items
</xsl:text>
<br />
<xsl:for-each select="Orders/Item">
<div>
Name: <xsl:value-of select="Name" />
<xsl:text>-</xsl:text>
Price: <xsl:value-of select="Price" />
<xsl:text>-</xsl:text>
Shipping Date: <xsl:value-of select="ShippingDate" />
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Output:
Phần tử xsl:number
Phần tử xsl:number có thể được sử dụng để xác định số thứ tự cho nút hiện tại. Nó cũng có thể được sử dụng để định dạng một số để hiển thị ở đầu ra.
Cú pháp:
<xsl:number count="pattern" format="{string}" value="expression"></xsl:number>
Trong đó:
pattern : Cho biết các node nào sẽ được tính, Chỉ các node khớp với mẫu mới được tính
format=”{string}” : Chuỗi mã thông báo chỉ định định dạng sẽ được sử dụng cho mỗi số trong danh sách.
value : Chỉ định biểu thức được chuyển đổi thành một số và xuất ra cây kết quả.
Ví dụ file XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="items.xsl" type="text/xsl"?>
<Items>
<Item>Item 1</Item>
<Item>Item 2</Item>
<Item>Item 3</Item>
<Item>Item 4</Item>
<Item>Item 5</Item>
</Items>
Tạo file xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Items">
<html>
<body>
<h3>List items</h3>
<xsl:for-each select="Item">
<p>
<xsl:value-of
select="position()" format="1." />
<xsl:value-of select="." />,
<xsl:number value="position()" format="I." />
<xsl:value-of select="." />
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Output:
Phần tử xsl:if
Phần tử xsl:if đánh giá một biểu thức điều kiện dựa trên nội dung của tệp XML. Thuộc tính test của phần tử xsl:if chứa một biểu thức điều kiện đánh giá một giá trị boolean là true hoặc false.
Cú pháp:
<xsl:if test="expression"></xsl:if>
Trong đó:
test=”expression” : Điều kiện trong dữ liệu nguồn để kiểm tra với các câu trả lời true hoặc false.
Ví dụ đoạn mã XML sau:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="books.xsl" type="text/xsl"?>
<Catalog>
<Book>
<Title>Book 1</Title>
<Author>Author 1</Author>
<Price>10.99</Price>
<Year>2020</Year>
</Book>
<Book>
<Title>Book 2</Title>
<Author>Author 2</Author>
<Price>12.99</Price>
<Year>2021</Year>
</Book>
<Book>
<Title>Book 3</Title>
<Author>Author 3</Author>
<Price>15.99</Price>
<Year>2019</Year>
</Book>
<Book>
<Title>Book 4</Title>
<Author>Author 4</Author>
<Price>9.99</Price>
<Year>2022</Year>
</Book>
<Book>
<Title>Book 5</Title>
<Author>Author 5</Author>
<Price>8.99</Price>
<Year>2023</Year>
</Book>
</Catalog>
File xsl tương ứng:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My Books</h2>
<table border="1">
<tr>
<th>Book title</th>
<th>Author</th>
<th>Year</th>
</tr>
<xsl:for-each select="Catalog/Book">
<xsl:if test="Price > 10">
<tr>
<td><xsl:value-of select="Title" /></td>
<td><xsl:value-of select="Author" /></td>
<td><xsl:value-of select="Year" /></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Output:
Phần tử xsl:choose
Phần tử xsl:choose được sử dụng để đưa ra quyết định khi có hai hoặc nhiều hướng hành động có thể xảy ra. Phần tử xsl:choose được sử dụng cùng với xsl:when và xsl:otherwise để thể hiện nhiều thử nghiệm có điều kiện.
<xsl:choose>
<xsl:when test="expression">
template body
</xsl:when>
<xsl:otherwise>
template body
</xsl:otherwise>
</xsl:choose>
Trong đó:
xsl:when test=”expression” : khi phần tử được kiểm tra theo thứ tự xuất hiện. Nếu biểu thức kiểm tra là đúng, mã chứa trong phần tử đó được thực thi.
xsl:otherwise : Nếu tất cả các điều kiện kiểm tra trong bất kỳ phần tử xsl:when nào là sai, thì phần tử xsl:otherwise sẽ tự động được chọn và mã được liên kết với phần tử đó được thực thi.
Ví dụ đoạn XML sau:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Publishers books</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>title</th>
<th>Author</th>
<th>Price</th>
<th>Year</th>
</tr>
<xsl:for-each select="Publisher/Book">
<tr>
<td>
<xsl:value-of select="Title" />
</td>
<xsl:choose>
<xsl:when test="Price > 10">
<td bgcolor="#ff0000">
<xsl:value-of select="Author" />
</td>
<td bgcolor="#ff0000">
<xsl:value-of select="Price" />
</td>
<td bgcolor="#ff0000">
<xsl:value-of select="Year" />
</td>
</xsl:when>
<xsl:otherwise>
<td>
<xsl:value-of select="Author" />
</td>
<td>
<xsl:value-of select="Price" />
</td>
<td>
<xsl:value-of select="Year" />
</td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Output:
Phần tử xsl:sort
<xsl:sort case-order="upper-first" | "lower-first" data-type="number" | "qname" | | "text" | order="ascending" | "decending" select="expression"></xsl:sort>
Trong đó:
case-order : Cho biết sắp xếp sẽ có chữ hoa hay chữ thường được liệt kê đầu tiên trong đầu ra sắp xếp. Tùy chọn mặc định là liệt kê chữ hoa trước
data-type : Chỉ định kiểu dữ liệu của các chuỗi.
number : Khóa sắp xếp được chuyển thành số.
qname : Sắp xếp dựa trên kiểu dữ liệu do người dùng xác định.
text : Chỉ định rằng các khóa sắp xếp phải được sắp xếp theo thứ tự bảng chữ cái
order : Thứ tự sắp xếp cho các chuỗi. Giá trị mặc định là “tăng dần”
select : Biểu thức xác định khóa mà sắp xếp sẽ dựa trên đó. Biểu thức được đánh giá và chuyển đổi thành một chuỗi được sử dụng làm khóa sắp xếp.
Ví dụ file XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="products.xsl" type="text/xsl"?>
<Products>
<Item>
<ItemCode>001</ItemCode>
<ItemName>Product 1</ItemName>
<ItemPrice>9.99</ItemPrice>
</Item>
<Item>
<ItemCode>002</ItemCode>
<ItemName>Product 2</ItemName>
<ItemPrice>14.99</ItemPrice>
</Item>
<Item>
<ItemCode>003</ItemCode>
<ItemName>Product 3</ItemName>
<ItemPrice>19.99</ItemPrice>
</Item>
<Item>
<ItemCode>004</ItemCode>
<ItemName>Product 4</ItemName>
<ItemPrice>24.99</ItemPrice>
</Item>
<Item>
<ItemCode>005</ItemCode>
<ItemName>Product 5</ItemName>
<ItemPrice>29.99</ItemPrice>
</Item>
</Products>
Ví dụ file xsl tương ứng:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="Products/Item">
<xsl:sort data-type="number" select="ItemPrice" order="descending" />
<xsl:value-of select="ItemCode" />
<xsl:text>-</xsl:text>
<xsl:value-of select="ItemName" />
<xsl:text>-</xsl:text>
<xsl:value-of select="ItemPrice" />
<br/>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Bài tập
Yêu cầu:
Bài 1: Tạo tập tin LopHoc.xml. Truy vấn và hiển thị thông tin các lớp học
MaLop | TenLop |
CNTT14 | Công nghệ thông tin 2014 |
TCKT14 | Tài chính kế toán 2014 |
TKDH14 | Thiết kế đồ họa |
Bài 2: Tạo tập tin SinhVien.xml có định nghĩa kiểu dữ liệu sử dụng XML Schema.
- Giới tính chỉ nhập Nam hoặc Nữ
- Mã lớp nhập theo qui ước: 4 ký tự đầu là chữ cái, 2 ký tự kế tiếp là số
Truy vấn và hiển thị thông tin sinh viên tăng dần theo tên
STT | MaSv | TenSv | GioiTinh | NgaySinh | MaLop |
1 | sv01 | Phan Tuấn Cường | Nam | 03/03/1993 | CNTT14 |
2 | sv02 | Huỳnh Chí Tâm | Nam | 08/03/1993 | CNTT14 |
3 | sv03 | Vương Chí Dũng | Nam | 14/04/1991 | CNTT14 |
4 | sv04 | Phạm Đức Nguyên | Nam | 27/07/1993 | TCKT14 |
5 | sv05 | Trương Mỹ Yến Nhi | Nữ | 03/10/1993 | TCKT14 |
6 | sv06 | Hồ Võ Thanh Tùng | Nam | 06/09/1990 | TCKT14 |
Bài 3:
Tạo tập tin MonHoc.xml có định nghĩa kiểu dữ liệu sử dụng XMLSchema với yêu cầu: Số giờ tối thiểu là 4, tối đa là 48.
Truy vấn và hiển thị các môn học có số giờ từ 40 trở lên
MaMh | TenMh | SoGio |
CSDL | Cơ sở dữ liệu | 30 |
MCB | Mạng căn bản | 30 |
THDC | Tin học đại cương | 45 |
THVP | Tin học văn phòng | 45 |
XLA | Xử lý ảnh | 45 |
Bài 4: Tạo tập tin KetQua.xml có định nghĩa kiểu dữ liệu sử dụng XMLSchema với Điểm thi >=0 và điểm thi <=10
Truy vấn và hiển thị điểm thi của những sinh viên học môn THVP và có điểm thi >= 5. Hiển thị giảm dần theo điểm thi.
MaSv | MaMh | DiemThi |
sv01 | THDC | 8 |
sv01 | THVP | 9.5 |
sv02 | THDC | 5.5 |
sv02 | THVP | 10 |
sv03 | THDC | 9 |
sv03 | THVP | 4.5 |
Bài 5: Hãy tạo một tệp tin XML sử dụng DTD để định nghĩa cấu trúc danh sách 5 sản phẩm. Mỗi sản phẩm cần chứa 5 đặc tả bên trong, bao gồm tên sản phẩm, mô tả, giá, số lượng, và ngày sản xuất.
-
- Yêu cầ u hiển thị dữ liệu dưới dạng bảng trong HTML (table) (sử dụng xsl:for-each)
- Hiển thị dữ lệu dưới dạng bảng nhưng chỉ lấy ra bản ghi giá lớn hơn 10$ (sử dụng xsl:if)
- Hiển thị dữ liệu dưới dạng bảng nhưng với sản phẩẩm giá lớn hơn 10 màu nền đỏ, nếu không không có nền (sử dụng xsl:choose)
Bài 6: (Nâng cao) Tạo tệp PHP để tương tác với CSDL, trong CSDL lưu trữ bảng product gồm các cột mô tả đặc tả sản phẩm, sau đó từ tệp PHP generate ra nội dung một file XML biểu diễn cấu trúc danh sách sản phẩm dưới dạng thẻ và tạo file XSL theo để áp dụng template cho cấu trúc XML dựa theo danh sách sản phẩm trên CSDL