190
Chương 5: XML
<td>ID</td><td>Name</td><td>Price</td>
<xsl:apply-templates select="Items/Item"/>
</table></body></html>
</xsl:template>
<xsl:template match="Items/Item">
<tr>
<td><xsl:value-of select="@id"/></td>
<td><xsl:value-of select="Name"/></td>
<td><xsl:value-of select="Price"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
Về cơ bản, mọi XSL stylesheet gồm một tập các template. Mỗi template so trùng với các phần
tử trong tài liệu nguồn và rồi mô tả các phần tử được so trùng để tạo nên tài liệu kết quả. Để
so trùng template, tài liệu XSLT sử dụng biểu thức XPath, như được mô tả trong mục 5.6.
Stylesheet vừa trình bày ở trên (orders.xslt) gồm hai template (là các con của phần tử
stylesheet gốc). Template đầu tiên trùng khớp với phần tử
Order
gốc. Khi bộ xử lý XSLT tìm
thấy một phần tử
Order
, nó sẽ ghi ra các thẻ cần thiết để bắt đầu một bảng HTML với các tiêu
đề cột thích hợp và chèn dữ liệu về khách hàng bằng lệnh
value-of
(ghi ra kết quả dạng text
của một biểu thức XPath). Trong trường hợp này, các biểu thức XPath (
Client/@id
và
Client/Name
) trùng với đặc tính
id
và phần tử
Name
.
Kế tiếp, lệnh
apply-templates
được sử dụng để phân nhánh và xử lý các phần tử
Item
nằm
trong. Điều này là cần thiết vì có thể có nhiều phần tử
Item
. Mỗi phần tử
Item
được so trùng
bằng biểu thức
Items/Item
(nút gốc
Order
không được chỉ định vì
Order
chính là nút hiện tại).
Cuối cùng, các thẻ cần thiết sẽ được ghi ra để kết thúc tài liệu HTML.
Nếu thực thi phép biến đổi này trên file orders.xml (đã trình bày trong mục 5.6), bạn sẽ nhận
được kết quả (tài liệu HTML) như sau:
<html>
<body>
<p>
Order <b>ROS-930252034</b>
for Remarkable Office Supplies</p>
<table border="1">
<td>ID</td>
<td>Name</td>