24/05/2018, 19:32

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 &lt;=$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>
Các thẻ xử lý bên trong vòng lặp có thể sử dụng biểu thức Xpath theo cách định vị tương đối từ nút ngữ cảnh ( nút hiện hành ) thay cho sử dụng định vị tuyệt đối

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>
0