XSL và XSLT

XSL và XSLT


Giới thiệu về XSL

XSL là dạng ngôn ngữ được xây dựng trên nền tảng XML để tạo ra stylesheet  nhằm mục đích trình bày hay chuyển đổi linh hoạt XML thành các định dạng khác tùy theo mục đích hiển thị khác nhau .
Extensible Stylesheet Language (XSL) được dùng để định dạng, hiển thị nội dung nội dung hay chuyển đổi các tài liệu XML.

XSL gồm 3 ngôn ngữ:
XSL Transformations (XSLT) là ngôn ngữ dạng XML dùng để chuyển đổi XML thành các dạng khác .
XML Path Language (XPath) là ngôn ngữ dùng để truy xuất các thành phần trong XML.
XSL Formatting Objects (XSL-FO) là ngôn ngữ dùng để định dạng các tài liệu XML.


XSL Transformations(XSLT

Như đã nói ở trên XSLT dùng để chuyển đổi các tài liệu XML sang các tài liệu dạng khác .

Mô tả quá trình chuyển đổi một tài liệu XMLsử dụng công cụ chuyển đổi và XSL (bộ sử lí XSLT)




Ví dụ chuyển từ XML sang HTML

Cấu trúc và cú pháp của XSLT

XSLT tuân theo các quy tắc giống như trong tài liệu XML.
Trong XSL , các kiểu quy tắc được viết trong 1 tệp có đuôi .xsl
Để kết hợp tệp .xsl với một tài liệu XML ta khai báo:
<?xml-stylesheet  href="xsl file"  type="text/xsl"?>

Gọi XSL trong file XML
Ví dụ về file .xsl

File XSL

View XML trên IE

Stylesheet  - Gồm một tập các lệnh làm hiển thị trực quan nội dung trong một trang web.
Cascading Style Sheet (CSS) sử dụng để thêm các kiểu địng dạng ( ví dụ : phông chữ, màu sắc,..)  trong các tài liệu web.
Phân biệt CSS và XSL


CSS XSL
Dùng để định dạng nội dung cho tài kiệu HTML và XMLDùng để định dạng nội dung cho tài liệu XML
Xác định cái nhìn trực quan của một trang, nhưng không làm 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
Nó không hỗ trợ xác định cấu trúc của tài liệu
và nó cũng không thể tính toán số lượng hay giá trị của biến.
Ngược lại thì XSL hỗ trợ xác định cấu trúc và có thể tính toán số lượng hay giá trị của các biến.
Người dùng sử dụng các kí hiệu  của riêng mình Sử dụng kí hiệu XML
Hiệu quả cao và khá dễ học để tạo một ứng dụng đơn giản Thiết kế để đáp ứng nhu cầu của những ứng dụng phức tạp để các stylesheet đẹp hơn.


Thẻ root của một file XSLT


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   .....................
   
</xsl:stylesheet>

<xsl:stylesheet> là gốc cho tất cả các thẻ khác trong XSLT.

Top level XSLT
Top level XSLT là các thẻ con của thẻ <xsl:stylesheet> bao gồm các thẻ:
- xsl:attribute-set: Dùng để thêm các thuộc tính định dạng.
xsl:import: dùng để import nội dung của một XSLT khác vào XSLT hiện hành

xsl:namespace-alias: khai báo namespace thay thế namespace của XML

xsl:output: khai báo định dạng của output, element này có nhiều thuộc tính, quan trọng nhất là thuộc tính method là định dạng XML, HTML hay text

xsl:template: khai báo template cho các element trong XML

xsl:variable: khai báo hoặc gán giá trị cho biến dùng trong XSLT.

Làm việc với XSLT

1. <xsl:template>: là thành phần chính của XSLT, dùng để khai báo các luật dùng để chuyển đổi các element tương ứng với thuộc tính “match” của thẻ này.

Cú pháp khai báo <xsl:template>

<xsl:template match=”mẫu” mode=”chế_đ” name=”tên” priority=”number”>
</xsl:template>
trong đó:
match: khai báo element nào sẽ áp dụng template này nếu không có thuộc tính này bắt buộc phải có thuộc tính name dùng để khai báo tên của template
mode: cho phép các các nút giống nhau sẽ được áp dụng nhiều hơn 1 lần
name: dùng để khai báo tên của template, nếu không có thuộc tính này thì phải có thuộc tính match
priority: là một số nguyên dùng để khai báo cấp độ của 1 template trong trường hợp có nhiều template cho 1 element, template cấp độ cao hơn sẽ được áp dụng.
2. <xsl:apply-templates>: 
- Xác định các nút cần được xử lí.
- Dùng để áp dụng một template cho element hiện hành hay áp dụng cho các element con của element hiện hành.
Cú pháp:
<xsl:apply-templates select=”tên_của_element”/>.
Trong đó thuộc tính select dùng để khai báo tên element áp dụng template. Nếu thuộc tính này không được khai báo thì mặc định sẽ chọn tất cả các thẻ con của thẻ hiện hành
3.<xsl:value-of>: - Để viết hay hiển thị giá trị của phần tử được xác định bởi thuộc tính select.
- Một 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: dùng để khai báo tên của Element cần lấy giá trị
– disable-output-escaping: giá trị hoặc yes hoặc no, dùng để khai báo các ký tự đặc biệt sẽ được hiển thị như thế nào, nếu giá trị là “yes” các ký tự đặc biệt sẽ được xuất ra output đúng như định dạng ban đầu, nếu là “no” các ký tự này sẽ được thay thế (ví dụ như & tương đương &amp; ).

 4. <xsl:for-each> Dùng để khai báo vòng lặp cho tập hợp các element giống nhau.
- Nó áp dụng một mẫu lặp đi lặp lại cho mỗi nút trong một tập hợp.

Cú pháp:

<xsl:for-each select=”expression”>



</xsl:for-each>

5. <xsl:text>: dùng để thêm 1 chuỗi ký tự vào output.
- Phần tử này không thể chứa bất kì một phần tử XSL nào khác.

Cú pháp:

<xsl:text disable-output-escaping=”yes|no”>

text....

</xsl:text>

– disable-output-escaping: giá trị hoặc yes hoặc no, dùng để khai báo các ký tự đặc biệt sẽ được hiển thị như thế nào, nếu giá trị là “yes” các ký tự đặc biệt sẽ được xuất ra output đúng như định dạng ban đầu, nếu là “no” các ký tự này sẽ được thay thế (ví dụ như & tương đương &amp; ).

6. <xsl:number> Để xác định số thứ tự của nút hiện tại hay nó cũng có thể được sử dụng để định dạng một số để hiển thị trong output.
 <xsl:number  format=”kí_tự”  value=”hành_động”/>

– Ví dụ:

<xsl:number  value=”position()” format=”1″/>

Trong đó:

value=”position()”: lấy vị trí của thẻ hiện hành trong list

format=”1”: xuất ra output vị trí này bắt đầu từ 1

7. <xsl:if >
- Đánh giá một biểu thức có điều kiện đối với nội dung file XSL
- Kiểm tra dữ liệu thỏa mãn điều kiện nào đó hay không.


<xsl:if test=”điệu_kiện”>…</xsl:if>

– Ví dụ: chúng ta sẽ thêm vào bảng trên cột kiểm tra nếu price > 10: đắt, <10: rẻ. Chúng ta thêm đoạn code sau vào file XSLT:

<td><xsl:if test=”price &lt; 10″>Rẻ</xsl:if>

        <xsl:if test=”price &gt;= 10″>Đắt</xsl:if>

</td>
8. <xsl:choose> để đưa ra quyết định khi có hai hoặc nhiều lựa chọn.
- Phần tử này được sử dụng kết hợp với <xsl: when> và <xsl:ortherwise> để thể hiện nhiều biểu thức có điều kiện.
<xsl:choose>

       <xsl:when test=”expression>

      ….

       </xsl:when>

      ….

       <xsl:otherwise>

       …

       </xsl:otherwise>

</xsl:choose>

9.<xsl:sort>. - Dùng để sắp xếp một nhóm các thành phần tương tự.
- Việc sắp xếp có thể được thực hiện bằng nhiều cách khác nhau bằng cách sử dụng nhưng thuộc tính của phần tử này.
-  Trong tệp XSL, phần tử <xsl: sort> nằm bên trong phần tử <xsl: for-each>

Cú pháp:

<xsl:sort  case-order=”upper-first | lower-first” data-type=”number | qname | text” order=”ascending | descending” select=”expression”/>

– Ví dụ chúng ta sắp xếp danh sách book theo title tăng dần. Chúng ta thêm dòng sau sau dòng
<xsl:for-each>:
<xsl:sort data-type=”text” order=”ascending” select=”title”/>

Bài tập tham khảo

Dưới đây là một sô ví dụ sử dụng những thuộc tính đã nêu ở trên.

Ví dụ có sử dụng xsl:textxsl:value-ofxsl:for-eachxsl:sort.
<!--                    file XML             -->
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type = "text/xsl" href = "Book_stylesheet.xsl"?>

<Book>
  <ISBN>101-45979-9-98</ISBN>
  <Title>David's XML Bible</Title>
  
  <Author>
    <FirstName>David</FirstName>
    <LastName>Blake</LastName>
  </Author>
  
  <Chapters>
    <Preface>
      <Name>Welcome</Name>
      <Number>1</Number>
      <Pages>2</Pages>
    </Preface>
    
    <Chapter>
      <Name>Working with XSLT</Name>
      <Number>3</Number>
      <Pages>40</Pages>
    </Chapter>
    
    <Chapter>
      <Name>Sorting in XSLT</Name>
      <Number>4</Number>
      <Pages>4</Pages>
    </Chapter>
    
    <Chapter>
      <Name>More on XSLT</Name>
      <Number>2</Number>
      <Pages>50</Pages>
    </Chapter>
    
    <Chapter>
      <Name>XPath in XSL</Name>
      <Number>5</Number>
      <Pages>10</Pages>
    </Chapter>
    
    <Chapter>
      <Name>XSL - Formatting Objects</Name>
      <Number>1</Number>
      <Pages>25</Pages>
    </Chapter>
  </Chapters>
  
</Book>

<!-- --------------------file 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="/Book">
    
    <body>
      <h1 align = "center">
        <xsl:value-of select="ISBN"/>
        <xsl:text>,</xsl:text>
      
        <xsl:value-of select="Title"/>
      </h1>
      <h2 align = "center">
        <xsl:text>by </xsl:text>
        <xsl:value-of select="Author/FirstName"/>
        
        <xsl:text> </xsl:text>
        <xsl:value-of select="Author/LastName"/>
      </h2>
      <table border="1">
        <tr>
          <td align="right">
            <xsl:text>Preface </xsl:text>
            <xsl:value-of select="Chapters/Preface/Number"/>
          
          </td>
          <td>
            <xsl:value-of select="Chapters/Preface/Name"/>
            <xsl:text>  ( </xsl:text>
            <xsl:value-of select="Chapters/Preface/Pages"/> 
            <xsl:text>  pages) </xsl:text>
          </td>
        </tr>
      
        <xsl:for-each select="Chapters/Chapter">
          <xsl:sort select="Number" order="ascending"/>
          <tr>
            <td align="right">
              <xsl:text>Chapter </xsl:text>
              <xsl:value-of select="Number"/>
            </td>
            <td>
              <xsl:value-of select="Name"/>
              <xsl:text>  ( </xsl:text>
              <xsl:value-of select="Pages"/> 
              <xsl:text>  pages) </xsl:text>
            </td>
          </tr>
        </xsl:for-each>
      </table>
    </body>
  </xsl:template>

</xsl:stylesheet>
Ví dụ có sử dụng xsl:if xsl:choose.
<!--          file XML -->
<?xml version="1.0" encoding="UTF-8"?>


<?xml-stylesheet type="text/xsl" href="SalesData_stylesheet.xsl"?>

<CottonDesk>
  <SalesPerson>
    <Product>Monitor</Product>
    <Name>Harry Diana</Name>
    <Age>23</Age>
    <Sales>4000</Sales>
  </SalesPerson>
  
  <SalesPerson>
    <Product>Laptop</Product>
    <Name>David Blake</Name>
    <Age>32</Age>
    <Sales>20000</Sales>
  </SalesPerson>
  
  <SalesPerson>
    <Product>Laptop</Product>
    <Name>Susan Jones</Name>
    <Age>55</Age>
    <Sales>35000</Sales>
  </SalesPerson>
  
  <SalesPerson>
    <Product>Laptop</Product>
    <Name>Martin Howell</Name>
    <Age>25</Age>
    <Sales>1000</Sales>
  </SalesPerson>
  
  <SalesPerson>
    <Product>Keyboard</Product>
    <Name>John Dani</Name>
    <Age>45</Age>
    <Sales>35000</Sales>
  </SalesPerson>
  
  <SalesPerson>
    <Product>Laptop</Product>
    <Name>Tony Kemp</Name>
    <Age>35</Age>
    <Sales>31000</Sales>
  </SalesPerson>
  
</CottonDesk>

<!--   file 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="/">
    <xsl:for-each select="CottonDesk/SalesPerson">
      <xsl:if test="Product='Laptop'">
        <xsl:choose>
          <xsl:when test="Sales > 30000">
            <span style="color:blue;">
              NAME:
              <xsl:value-of select="Name"/>
              AGE:
              <xsl:value-of select="Age"/>
              Your Commision is $5000.
            </span>
          </xsl:when>
          
          <xsl:when test="Sales > 20000">
            <span style="color:green;">
              NAME:
              <xsl:value-of select="Name"/>
              AGE:
              <xsl:value-of select="Age"/>
              Your Commision is $1000.
            </span>
          </xsl:when>
          
          <xsl:when test="Sales > 10000">
            <span style="color:red;">
              NAME:
              <xsl:value-of select="Name"/>
              AGE:
              <xsl:value-of select="Age"/>
              Your Commision is $500.
            </span>
          </xsl:when>
          
          <xsl:when test="Sales > 5000">
            <span style="color:magenta;">
              NAME:
              <xsl:value-of select="Name"/>
              AGE:
              <xsl:value-of select="Age"/>
              Your Commision is $100.
            </span>
          </xsl:when>
          
          <xsl:otherwise>
            <span style="color:black;">
              NAME:
              <xsl:value-of select="Name"/>
              AGE:
              <xsl:value-of select="Age"/>
              Your Commision is $0.
            </span>
          </xsl:otherwise>
          
        </xsl:choose>
        <br/>
      </xsl:if>
    </xsl:for-each>
    
  </xsl:template>


</xsl:stylesheet>


Ví dụ có sử dụng xsl:apply-templates
<!-- file XML -->
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="congty.xsl"?>
<congty>
    <nhanvien>
        <hoten>Van Anh</hoten>
        <tuoi>28</tuoi>
        <diachi>Ha Noi</diachi>
        <luong>500</luong>
    </nhanvien>
    <nhanvien>
        <hoten>Hai Yen</hoten>
        <tuoi>38</tuoi>
        <diachi>Hai Phong</diachi>
        <luong>800</luong>
    </nhanvien>
    <nhanvien>
        <hoten>Tuan Hai</hoten>
        <tuoi>32</tuoi>
        <diachi>Ha Noi</diachi>
        <luong>600</luong>
    </nhanvien>
    <nhanvien>
        <hoten>Long Van</hoten>
        <tuoi>33</tuoi>
        <diachi>Ha Noi</diachi>
        <luong>700</luong>
    </nhanvien>
      <nhanvien>
        <hoten>Van Kien</hoten>
        <tuoi>29</tuoi>
        <diachi>Ha Noi</diachi>
        <luong>750</luong>
    </nhanvien>
     <nhanvien>
        <hoten>Nguyen Lan</hoten>
        <tuoi>25</tuoi>
        <diachi>Hai Phong</diachi>
        <luong>600</luong>
    </nhanvien>
     <nhanvien>
        <hoten>Thu Phuong</hoten>
        <tuoi>34</tuoi>
        <diachi>Quang Ninh</diachi>
        <luong>800</luong>
    </nhanvien>
    
</congty>

<!--  file 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="congty">
        <html>
            <head>
                <title>congty.xsl</title>
            </head>
            <body>
                <table border="1">
                    <tr>
                        <td>Ho ten</td>
                        <td>Tuoi</td>
                        <td>Dia chi</td>
                        <td>Luong</td>
                        <td>Thue</td>                        
                    </tr>              
                    <xsl:apply-templates select="nhanvien">
                        <xsl:sort select="tuoi"/> 
                    </xsl:apply-templates>                          
                </table>
                Sum is  <xsl:value-of select="sum(nhanvien/luong)"/>                         
                <br/>
                Count is <xsl:value-of select="count(nhanvien/luong)" />
            </body>
        </html>
    </xsl:template>
      
    <xsl:template match="nhanvien">  
        <!-- <xsl:sort select="tuoi"/>    khong sap xep vi ko dung for  -->
        <tr>            
            <td>
                <xsl:value-of select="hoten"/>
            </td>
            <td> 
                <xsl:value-of select="tuoi"/>
            </td>
            <td> 
                <xsl:value-of select="diachi"/>
            </td>
            <td> 
                <xsl:value-of select="luong"/>
            </td>
            <td>            
                <xsl:value-of select="luong*0.1"/>
            </td>         
                 
        </tr>
      
    </xsl:template>

</xsl:stylesheet>


Trên đây là mình đã giới thiệu về tài liệu XSL ,XSLT , các thuộc tính của chúng cùng một số ví dụ cụ thể. Hy vọng bài viết có thể giúp mọi người hiểu được phần nào về chúng. Nhớ follow để cập nhật những bài viết tiếp theo của mình nhé. Thân ^^

Nhận xét