Biến đổi XML với XSLT
Chương trình XSLT : Khái niệm : - Một loại tài liệu XML đặc biệt bao gồm các thẻ xử lý cho phép biến đổi một tài liệu XML thành một tài liệu văn bản bất ký - Một loại chương trình thông dịch đặc biệt với + Dữ ...
Chương trình XSLT :
Khái niệm :
- Một loại tài liệu XML đặc biệt bao gồm các thẻ xử lý cho phép biến đổi một tài liệu XML thành một tài liệu văn bản bất ký
- Một loại chương trình thông dịch đặc biệt với
+ Dữ liệu nguồn : Tài liệu XML
+ Kết xuất : Tài liệu dạng văn bản
Tài liệu XML ---- > Chương trình XSLT ---- > Tài liệu văn bản
Các ứng dụng chính :
XSLT có 2 ứng dụng chính hiện nay
1. Thực hiện biến đổi từ tập tin XMl vào trang Web với ngôn ngữ HTML
2. Thực hiện biến đổi từ tập tin XML vào tập tin XML khác
Xml --- > Html
Chp phép thể hiện nội dung tập tin Xml trên trang Web
Tập tin Xml Don_thuc.xml
<DON_THUC He_so="4" So_mu="6" />
thông qua xử lý của chương trình Xuat_don_thuc.Xslt sẽ được thể hiện trên trang Web 4 x 6
Xml -- > Xml
Cho phép tạo tập tin Xml mới từ tập tin Xml hiện có để có thể trích rút thông tin, tái cấu trúc các thẻ, v.v...
Tập tin Xml Don_thuc.xml
<DON_THUC He_so="4" So_mu="6" />
thông qua xử lý của một chương trình Xslt sẽ tạo ra tập tin Don_thuc_1.xml như sau
<DON_THUC>
<He_so> 4 </He_so>
<So_mu> 6 </So_mu>
</DON_THUC>
Cấu trúc chương trình XSLT
Cấu trúc chương trình XSLT
Cấu trúc chương trình XSLT đơn giãn
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl
=http://www.w3.org/1999/XSL/Transform
>
<xsl:template match="/" >
Các lệnh ( thẻ ) xử lý cho phép trích rút thông tin từ Tập tin Xml nguồn và kết xuất vào tập tin kết quả
</xsl:template>
</xsl:stylesheet>
Chương trình sau cho phép biến đối tập tin Nguoi_dung.xml
<NGUOI_DUNG Ho_ten="Trần văn Long" />
để tạo tập tin văn bản với nội dung
Xin chào Trần văn Long. Đây là chương trình XSLT đầu tiên của tôi
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:output method="text"/>
<xsl:template match="/" >
Xin chào <xsl:value-of select="/NGUOI_DUNG
/@Ho_ten
"/>
Đây là chương trình XSLT đầu tiên của tôi
</xsl:template>
</xsl:stylesheet>
Chương trình sau cho phép biến đối tập tin xml
<GOC>
<SO Gia_tri="5" />
<SO Gia_tri="7" />
</GOC>
để tạo tập tin văn bản với nội dung
5+7 =12
<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="text"/>
<xsl:template match="/" >
<xsl:value-of select="/GOC/SO[1]
/@Gia_tri
"/> +
<xsl:value-of select="/GOC/SO[2]
/@Gia_tri
"/> =
<xsl:value-of select="/GOC/SO[1]
/@Gia_tri
+ /GOC/SO[2]
/@Gia_tri
" />
</xsl:template>
</xsl:stylesheet>
Cho thực hiện chương trình XSLT
Cho thực hiện chương trình XSLT
Quá trình thực hiện
Bao gồm 3 bước
Bước 1 : Chuẩn bị dữ liệu nguồn là tập tin XML Bước 2 : Soạn thảo chương trình XSLT
Bước 3 : Cho thực hiện chương trình
Bước 1 : Dữ liệu nguồn có thể được chuẩn bị thông qua một trong các cách sau
- Cách 1 : Sử dụng trình soạn thảo văn bản bất kỳ ( vì tài liệu XML chỉ là một văn bản)
- Cách 2 : Sử dụng trình soạn thảo XML Editor
Bước 2 : Chương trình XSLT có thể được chuẩn bị thông qua một trong các cách sau
- Cách 1 : Sử dụng trình soạn thảo văn bản bất kỳ ( vì tài liệu XML chỉ là một văn bản)
- Cách 2 : Sử dụng trình soạn thảo XML Editor
- Cách 3 : Sử dụng trình soạn thảo chương trình XSLT ( XSLT Editor)
Bước 3 :
Tùy theo mục tiêu của việc thực hiện có thể tiến hành một trong 3 cách sau
Cách 1 : Sử dụng môi trường lập trình
Cho thực hiện trực tiếp bên trong môi trường lập trình
Cách này thích hợp cho việc học tập và thử nghiệm chương trình XSLT Cách 2 : Sử dụng trình duyệt Web
Cho thực hiện trực tiếp với sự hổ trợ của trình duyệt Web
Cách này cho phép ứng dụng trực tiếp XSLT trong việc thể hiện hto6ng tin trên Web
Cách 3 : Tự viết chương trình
Cho thực hiện thông qu việc viết một ứng dụng trong ngôn ngữ lập trình khác ( ví dụ C#). Ứng dụng này sẽ
- Nạp/Đọc chương trình XSLT vào bộ nhớ
- Chuẫn bị dữ liệu nguồn ( nếu cần thiết )
- Cho thực hiện
- Xử lý kết xuất được tạo ra ( nếu cần thiết )
Cách này thích hợp khi cần "nhúng" chương trình XSLT vào một ứng dụng để có thể thực hiện nhanh, dễ bảo trì, chuẩn một số xử lý biến đổi nào đó liên quan tài liệu XML
* Sử dụng môi trường lập trình
Với môi trường lập trình Visual Studio.NET
Bươc 1 : Tạo tập tin Xml nguồn
Chọn Project - Add New Item với loại tập tin là Xml
=== > Cửa sổ cho phép soạn thảo tập tin Xml
Bước 2 : Tạo chương trính XSLT
Chọn Project - Add New Item với loại tập tin Xslt
=== > Cửa sổ cho phép soạn thảo chương trình XSLT
Bước 3 : Cho thực hiện
3.1 Bước 3.1 :
Chọn của sổ Properties để xác định tập tin Xml nguồn và tập tin kết xuất
3.2 Bước 3.2 :
Quay về cửa sổ soạn thảo chương trình XSLT ( Click và cửa sổ ) và sau đó chọn chức năng Xml ---> Debug XSLT
Bước 3.1 Chỉ cần thực hiện một lần nếu không thay đổi tập tin nguồn
Có thể đánh dấu điểm ngắt bên trong chương trình XSLT tương tự khi Debug ứng dụng với ngôn ngữlập trình khác
* Sử dụng trình duyệt Web
Bươc 1 : Tạo tập tin Xml nguồn với chỉ thị yêu cầu thực hiện chương trình XSL
<?xml-stylesheet type="text/xsl" href=Chuỗi đường dẫn đến tập tin chương trình XSLT ?>
<?xmlversion="1.0"encoding="utf-8" ?>
<?xml-stylesheettype="text/xsl" href='Xuat_loi_chao.xslt' ?>
<NGUOI_DUNGHo_ten="Trần văn Long" />
Bước 2 : Tạo chương trính XSLT
Chọn Project - Add New Item với loại tập tin Xslt
=== > Cửa sổ cho phép soạn thảo chương trình XSLT
Bước 3 : Cho thực hiện
Mở trình duyệt Web và sau đó chọn URL là đường dẫn đến tập tin Xml
* Tự viết chương trình
Bươc 1 : Tạo tập tin Xml nguồn Bước 2 : Tạo chương trính XSLT
Chọn Project - Add New Item với loại tập tin Xslt
=== > Cửa sổ cho phép soạn thảo chương trình XSLT
Bước 3 : Cho thực hiện
....
Khai báo đối tượng Bo_thuc_hien
Đọc tập tin chương trình XSL vào Bo_thuc_hien
Yêu cầu Bo_thuc_hien thực hiện chương trình XSLT với dữ liệu nguồn và kết xuất
....
với Visual Studio.NET 2005 VB.NET
Đoạn chương trình sau sẽ cho thực hiện chương trình Xuat_loi_chao.Xslt
- Dữ liệu nguồn là tập tin Nguoi_dung.xml
- Kết xuất là tập tin văn bản Loi_chao.txt
( Tật cả các tập tin đều đặt trong thư mục của Project )
Imports System.Xml Imports System.Xml.Xsl Module Thuc_hien_XSLT Public Sub Main()
Dim Duong_dan_Xml As String = "....Nguoi_dung.xml" Dim Duong_dan_Xslt As String = "....Xuat_loi_chao.xslt" Dim Duong_dan_Kq As String = "....Loi_chao.txt"
Dim Thuc_hien As New XslCompiledTransform(True) Thuc_hien.Load(Duong_dan_Xslt)
Thuc_hien.Transform(Duong_dan_Xml, Duong_dan_Kq)
End Sub
End Module
Các ví dụ minh họa
Các ví dụ minh họa
Mục tiêu :
Minh họa trực quan một số chương trình XSLT.
Các chương trình này sẽ được diễn giải chi tiết về sau trong các mục khác
=== > Chưa yêu cầu hiểu ý nghĩa các lệnh
=== > Sử dụng để rèn luyện cách cho thực hiện chương trình XSLT
* Xuất cây trường - khối - lớp
Với tập tin Truong.xml có nội dung như sau
<?xmlversion="1.0"encoding="utf-8" ?>
<TRUONGTen="Trướng cấp 3 XXX">
<KHOITen="Khối 10" >
<LOPTen="Lớp 10A" />
<LOPTen="Lớp 10B" />
<LOPTen="Lớp 10C" />
<LOPTen="Lớp 10D" />
</KHOI>
<KHOITen="Khối 11" >
<LOPTen="Lớp 11A" />
<LOPTen="Lớp 11B" />
<LOPTen="Lớp 11C" />
</KHOI>
<KHOITen="Khối 12" >
<LOPTen="Lớp 12A" />
<LOPTen="Lớp 12B" />
<LOPTen="Lớp 12C" />
</KHOI>
</TRUONG>
Chương trình Xuat_truong.xslt sau sẽ kết xuất ( dạng Html ) các thông tin về trường ( bao gồm thông tin khối, lớp )
<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="html" />
<xsl:template match="/" >
<xsl:apply-templates select="TRUONG" />
</xsl:template>
<xsl:template match="TRUONG">
<xsl:value-of select=
"@Ten
"/>
<br />
Danh sách các khối lớp <br />
<xsl:apply-templates select="KHOI" />
</xsl:template>
<xsl:template match="KHOI">
<xsl:value-of select=
"@Ten
"/>
<br />
<xsl:apply-templates select="LOP" />
</xsl:template>
<xsl:template match="LOP">
<xsl:value-of select=
"@Ten
"/>
<br />
</xsl:template>
</xsl:stylesheet>
Thuộc tính select trong thẻ xsl:apply-templates có thể được bỏ qua và khi đó sẽ được hiểu là select="*"( cho lượng giá là các nút con của nút ngữ cảnh )
=== > Một trong các cách đơn giãn tổ chức chương trình Xslt là tổ chức chương trình theo các loại thẻ có trong tập tin Xml và gọi thực hiện (so khớp ) không cần tham số
Gọi thực hiện : <xsl:apply-templates /> Khai báo hàm/mẩu so khớp :
<xsl:template match="tên loại thẻ" > Các thẻ xử lý
</xsl:template>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="html" />
<xsl:templatematch="/" >
<xsl:apply-templates />
</xsl:template>
<xsl:templatematch="TRUONG">
<xsl:value-ofselect=
"@Ten
"/>
<br />
Danh sách các khối lớp <br />
<xsl:apply-templates />
</xsl:template>
<xsl:templatematch="KHOI">
<xsl:value-ofselect=
"@Ten
"/>
<br />
<xsl:apply-templates />
</xsl:template>
<xsl:templatematch="LOP">
<xsl:value-ofselect=
"@Ten
"/>
<br />
</xsl:template>
</xsl:stylesheet>
* Xuất danh sách chọn
Chương trình Xslt sau sẽ xuất danh sách chọn các đơn vị từ tập tin Cong_ty.xml
<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="html" />
<xsl:templatematch="/" >
<html>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:templatematch="CONG_TY" > Danh sách đơn vị :
<select>
<xsl:apply-templates />
</select>
</xsl:template>
<xsl:templatematch="DON_VI" >
<option>
<xsl:value-ofselect =
"@Ten
"/>
</option>
</xsl:template>
</xsl:stylesheet>
* Sắp xếp kết quả thi đấu Olympic
Với tập tin Xml Ket_qua_Olympic.xml
<?xmlversion="1.0"encoding="utf-8" ?>
<KET_QUA>
<QUOC_GIATen="AAA"So_vang="10"So_bac="7"So_dong="2" />
<QUOC_GIATen="XXX"So_vang="6"So_bac="0"So_dong="12" />
<QUOC_GIATen="BBB"So_vang="10"So_bac="8"So_dong="13" />
<QUOC_GIATen="DDD"So_vang="4"So_bac="17"So_dong="0" />
<QUOC_GIATen="MMM"So_vang="6"So_bac="1"So_dong="0" />
<QUOC_GIATen="KKK"So_vang="6"So_bac="0"So_dong="2" />
<QUOC_GIATen="LLL"So_vang="10"So_bac="4"So_dong="23" />
<QUOC_GIATen="PPP"So_vang="3"So_bac="27"So_dong="100" />
</KET_QUA>
Đoạn chương trình XSL sau sắp xếp các quốc gia giảm dần theo thứ tự ưu tiên
- Ứu tiên 1 : Số huy chương vàng
- Ứu tiên 2 : Số huy chương bạc
- Ưu tiên 3 : Số huy chương đồng
<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="xml"indent="yes" />
<xsl:templatematch="/" >
<xsl:apply-templates />
</xsl:template>
<xsl:templatematch="KET_QUA" >
<xsl:copy >
<xsl:apply-templates select ="QUOC_GIA">
<xsl:sort order="descending"data-type="number"select=
"@So_vang"
/>
<xsl:sort order="descending"data-type="number"select=
"@So_bac
" />
<xsl:sort order="descending"data-type="number"select=
"@So_dong"
/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:templatematch="QUOC_GIA" >
<xsl:copy >
<xsl:copy-ofselect =
"@*
"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Các thao tác cơ bản
Mục tiêu :
Trình bày các kỹ thuật xử lý cơ bản khi xây dựng chương trình XSLT
Nội dung :
1. Trích rút thông tin và kết xuất với thẻ xử lý xsl:value-of , xsl:variable
2. Xử lý rẽ nhánh với xsl:if , xsl:choose
3. Xử lý lặp với xsl:for-each. Xử lý so khớp với xsl:apply-templates , xsl:template
Trích rút và kết xuất thông tin
Vấn đề :
Cần trích một số thông tin trong tập tin Xml nguồn và đưa vào tập tin kết xuất
Hướng giải quyết :
Cách 1 : Trích rút thông tin từ tập tin Xml và sau đó kết xuất trực tiếp với thẻ xử lý
xsl:value -of
Cách 2 : Trích rút thông tin vào biến với thẻ xử lý xsl:variable và sau đó sử dụng biến này trong thẻ xử lý xsl:value-of
Thẻ xsl:value-of
Ý nghĩa :
Cho phép trích rút thông tin từ tập tin Xml hay từ giá trị của biến và sau đó đưa vào tập tin kết quả
Cú pháp :
Nếu trích rút thông tin từ tập tin Xml nguồn
<xsl:value-of select="Biểu thức Xpath" />Nếu trích rút thông tin từ biến
<xsl:value-of select="$Ten_bien" />Thẻ xsl:variable
Ý nghĩa :
Cho phép trích rút thông tin từ tập tin Xml và đưa vào một biến ( đúng ra là hằng ví nội dung biến này không thể thay đổi được )
Cú pháp :
<xsl:variable name="Ten_bien" select="Biểu thức Xpath" />
Chương trình tính tổng 2 số nguyên có thể thực hiện theo 2 cách
Cách 1 : Trích rút thông tin trực tiếp
<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="text"/>
<xsl:template match="/" >
<xsl:value-of select="/GOC/SO[1]
/@Gia_tri
"/> +
<xsl:value-of select="/GOC/SO[2]
/@Gia_tri
"/> =
<xsl:value-of select="/GOC/SO[1]
/@Gia_tri
+ /GOC/SO[2]
/@Gia_tri
" />
</xsl:template>
</xsl:template>
</xsl:stylesheet>
Cách 2 : Thông qua các biến
<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="text"/>
<xsl:templatematch="/" >
<xsl:variablename="So_1"select="/GOC/SO[1]
/@Gia_tri
" />
<xsl:variablename="So_2"select="/GOC/SO[2]
/@Gia_tri
" />
<xsl:value-ofselect="$So_1" /> +
<xsl:value-ofselect="$So_2" /> =
<xsl:value-ofselect="$So_1 + $So_2"/>
</xsl:template>
</xsl:stylesheet>
- Chỉ số các thẻ của tập tin Xml bắt đầu từ 1
- Biểu thức bên trong thuộc tính select có thể
+ Một biểu thức Xpath duy nhất
+ Một biến duy nhất
+ Biểu thức số học với thành phần là biểu thức Xpath hay biến
Điều này cho phép thực hiện một số xử lý trên thông tin nguồn trước khi kết xuất, tuy nhiên các xử lý này khá giới hạn ví Xslt được thiết kế và sử dụng vào mục tiếu chính là biến đổi
Rẻ nhánh
Vấn đề :
Cần rè nhánh xử lý kết xuất tùy vào điều kiện của tập tin Xml nguồn
Hướng giải quyết :
Cách 1 : Sử dụng thẻ xử lý xsl:if . Cách này cho phép chỉ kết xuất trong trường hợp một điều kiện nào đó được thỏa ( và nếu không thỏa thì không kết xuất gì cả )
Cách 2 : Sử dụng thẻ xử lý xsl:choose . Cách này cho phép kết xuất tùy theo nhiều điều kiện với các trường hợp khác nhau
Thẻ xsl:if
Ý nghĩa :
Cho phép chỉ thực hiện một số thẻ xử lý khi điều kiện được thỏa
Cú pháp :
<xsl:if test="Biểu thức logic " > Các thẻ xử lý
</xsl:if>Biểu thức logic bao gồm các biểu thức tính toán ( trên chuỗi Xpath hay giá trị biến ) cùng với các phép toán quan hệ >, >= , <,<= , = , != và các phép toán logic not , and , or
Thẻ xsl:choose
Ý nghĩa :
Tương tự như thẻ xsl:if nhưng cho phép sử dụng nhiều điều kiện khác nhau
Cú pháp :
<xsl:choose>
<xsl:when test="Biểu thức logic 1 " >
Các thẻ xử lý khi biểu thức logic 1 thỏa
</xsl:when>
<xsl:when test="Biểu thức logic 2 " >
Các thẻ xử lý khi biểu thức logic 2 thỏa
</xsl:when>
<xsl:otherwise >
Các thẻ xử lý khi tất cả các biểu thức logic trên đều không thỏa
</xsl:when>
</xsl:choose>
Ghi chú :
Thẻ xử lý trên có tác dụng tương tự cấu trúc if ( Diều kiện 1 )
{ ....
}
else if ( Điều kiện 2 )
{ ...}
..... else
{ ....
}
Chương trình xác định số nguyên lớn nhất có thể thực hiện theo 2 cách
Cách 1 : Sử dụng xsl:if
<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="text" />
<xsl:template match="/" >
<xsl:variable name="So_1" select="/GOC/SO[1]
/@Gia_tri
" />
<xsl:variable name="So_2" select="/GOC/SO[2]
/@Gia_tri
" /> Số lớn nhất trong 2 số
<xsl:value-of select="$So_1"/> và
<xsl:value-of select="$So_2"/> là
<xsl:if test="$So_1> $So_2" >
<xsl:value-of select ="$So_1"/>
</xsl:if>
<xsl:if test="$So_1 <=$So_2" >
<xsl:value-of select ="$So_2"/>
</xsl:if>
</xsl:stylesheet>
Cách 2 : Sử dụng xsl:choose
<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="text" />
<xsl:templatematch="/" >
<xsl:variablename="So_1"select="/GOC/SO[1]
/@Gia_tri
" />
<xsl:variablename="So_2"select="/GOC/SO[2]
/@Gia_tri
" /> Số lớn nhất trong 2 số
<xsl:value-of select="$So_1"/> và
<xsl:value-of select="$So_2"/> là
<xsl:choose>
<xsl:whentest="$So_1 > $So_2">
<xsl:value-ofselect ="$So_1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-ofselect ="$So_2"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Vòng lặp
Vấn đề :
Cần lặp lại các xử lý kết xuất trên một tập họp các nút của tãi liệu Xml nguồn
Hướng giải quyết :
Sử dụng thẻ xsl:for-each với biểu thức Xpath tương ứng tập họp nút cần lặp
Thẻ xsl:for-each
Ý nghĩa :
Cho phép lặp lại việc thức hiện các thẻ xử lý trên tập họp các nút là kết quả của một chuỗi truy vấn
Xpath
Cú pháp :
<xsl:for-each select="Biểu thức Xpath " > Các thẻ xử lý
</xsl:for-each>
Với tập tin nguồn Cong_ty.xml :
<?xml version="1.0" encoding="utf-8" ?>
<CONG_TY Ten="Công ty X">
<DON_VI Ten="Đơn vị A" />
<DON_VI Ten="Đơn vị B" />
<DON_VI Ten="Đơn vị C" />
<DON_VI Ten="Đơn vị D" />
</CONG_TY>
Chương trình Xuat_cong_ty.xslt sau sẽ kết xuất thông tin về công ty cùng với các đơn vị ( theo dạng kết xuất Html )
Công ty X
Danh sách các đơn vị Đơn vị A
Đơn vị B Đơn vị C Đơn vị D
<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="html" />
<xsl:template match="/" >
<xsl:value-of select="/CONG_TY
/@Ten
"/>
<br/>
Danh sách các đơn vị <br />
<xsl:for-each select="/CONG_TY/DON_VI" >
<xsl:value-of select=
"@Ten
"/>
<br />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Hàm
Vấn đề :
Với tập tin Xml có cấu trúc phức tạp hay xử lý kết xuất phức tạp. Việc tổ chức chương trình Xslt chỉvới một thẻ xsl:template duy nhật ( tương tự hàm Main duy nhất trong C#)
=== > Chương trình khó viết
=== > Chương trình khó đọc
====> Chương trình khó bảo trì
====> Các đoạn lệnh không tái sử dụng được
Hướng giải quyết :
Tổ chức chương trình thành các phần nhỏ với thẻ xử lý xsl:template ( tương tự các hàm tự định nghĩa. Mỗi phần như thế có tên gọi là tập mẩu và đóng vai trò tương tự như hàm trong ngôn ngữ lập trình khác
Thẻ xsl:template
Ý nghĩa :
Cho phép tổ chức chương trình Xslt với các thành phần nhỏ
== > Dễ viết
==> Dễ đọc
== > Dễ bảo trì
===> Tái sử dụng
Cú pháp khai báo
<xsl:template match="Biểu thức Xpath"> Các thẻ xử lý
</xsl:template>
Cú pháp "gọi thực hiện"
<xsl:apply-templates select="Biểu thức Xpath" /> Cơ chế "gọi thực hiện" ( cơ chế so khớp )
Quá trình "gọi thực hiện" ( so khớp ) của thẻ xử lý xsl:apply-templates như sau
Bước 1 : Lượng giá biểu thức Xpath của thẻ xử lý xsl:apply-templates
Bước 2 : Tìm khai báo xsl:template có thuộc tính match so khớp đúng
Bước 3 : "Gọi thực hiện " nhiều lần các thẻ xử lý bên trong, mỗi lần với một nút ngữ cảnh thuộc danh sách ước lượng của bước 1
Chương trình xuất thông tin về công ty có thể viết lại như sau
<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="html" />
<xsl:templatematch="/" >
<xsl:value-ofselect="/CONG_TY
/@Ten
"/>
<br/>
Danh sách các đơn vị <br />
<xsl:apply-templatesselect="/CONG_TY/DON_VI" />
</xsl:template>
<xsl:templatematch="DON_VI" >
<xsl:value-ofselect=
"@Ten
"/>
<br />
</xsl:template>
</xsl:stylesheet>
Với tập tin Truong.xml có nội dung như sau
<?xmlversion="1.0"encoding="utf-8" ?>
<TRUONGTen="Trướng cấp 3 XXX">
<KHOITen="Khối 10" >
<LOPTen="Lớp 10A" />
<LOPTen="Lớp 10B" />
<LOPTen="Lớp 10C" />
<LOPTen="Lớp 10D" />
</KHOI>
<KHOITen="Khối 11" >
<LOPTen="Lớp 11A" />
<LOPTen="Lớp 11B" />
<LOPTen="Lớp 11C" />
</KHOI>
<KHOITen="Khối 12" >
<LOPTen="Lớp 12A" />
<LOPTen="Lớp 12B" />
<LOPTen="Lớp 12C" />
</KHOI>
</TRUONG>
Chương trình Xuat_truong.xslt sau sẽ kết xuất ( dạng Html ) các thông tin về trường ( bao gồm thông tin khối, lớp )
<?xmlversion="1.0"encoding="UTF-8" ?>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="html" />
<xsl:template match="/" >
<xsl:apply-templates select="TRUONG" />
</xsl:template>
<xsl:template match="TRUONG">
<xsl:value-of select=
"@Ten
"/>
<br />
Danh sách các khối lớp <br />
<xsl:apply-templates select="KHOI" />
</xsl:template>
<xsl:template match="KHOI">
<xsl:value-of select=
"@Ten
"/>
<br />
<xsl:apply-templates select="LOP" />
</xsl:template>
<xsl:template match="LOP">
<xsl:value-of select=
"@Ten
"/>
<br />
</xsl:template>
</xsl:stylesheet>
Ghi chú :
Thuộc tính select trong thẻ xsl:apply-templates có thể được bỏ qua và khi đó sẽ được hiểu là select="*"( cho lượng giá là các nút con của nút ngữ cảnh )
=== > Một trong các cách đơn giãn tổ chức chương trình Xslt là tổ chức chương trình theo các loại thẻcó trong tập tin Xml và gọi thực hiện (so khớp ) không cần tham số
Gọi thực hiện : <xsl:apply-templates /> Khai báo hàm/mẩu so khớp :
<xsl:template match="tên loại thẻ" > Các thẻ xử lý
</xsl:template>
<xsl:stylesheetversion="1.0"xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform
">
<xsl:outputmethod ="html" />
<xsl:templatematch="/" >
<xsl:apply-templates />
</xsl:template>
<xsl:templatematch="TRUONG">
<xsl:value-ofselect=
"@Ten
"/>
<br />
Danh sách các khối lớp <br />
<xsl:apply-templates />
</xsl:template>
<xsl:templatematch="KHOI">
<xsl:value-ofselect=
"@Ten
"/>
<br />
<xsl:apply-templates />
</xsl:template>
<xsl:templatematch="LOP">
<xsl:value-ofselect=
"@Ten
"/>
<br />
</xsl:template>
</xsl:stylesheet>