XPath trong XML
- 21-06-2023
- Toanngo92
- 0 Comments
Mục lục
Khái niệm XPath
Giới thiệu về XPath
XPath có thể được coi là một ngôn ngữ truy vấn như SQL. Tuy nhiên, thay vì trích xuất thông tin từ cơ sở dữ liệu, nó trích xuất thông tin từ tài liệu XML. XPath là ngôn ngữ để truy xuất thông tin từ tài liệu XML. XPath được sử dụng để điều hướng qua các thành phần và thuộc tính trong tài liệu XML. Do đó, XPath cho phép xác định các phần của tài liệu XML.
XPath cung cấp một cú pháp chung như thể hiện trong hình cho các tính năng được chia sẻ bởi XSLT và XQuery:
XSLT
XSLT là ngôn ngữ để chuyển đổi thông tin tài liệu XML sang XML, HTML hoặc văn bản
XQuery
XQuery xây dựng trên XPath và là ngôn ngữ để trích xuất thông tin từ các tài liệu XML.
Lợi ích của XPath
XPath được thiết kế cho các tài liệu XML. Nó cung cấp một cú pháp duy nhất mà bạn có thể sử dụng cho các truy vấn, đánh địa chỉ và các mẫu. XPath ngắn gọn, đơn giản và mạnh mẽ.
XPath có cácXPath được thiết kế để sử dụng trong nhiều ngữ cảnh. Nó được áp dụng để cung cấp các liên kết đến các nút, để tìm kiếm các kho lưu trữ và cho nhiều ứng dụng khác. ưu điểm như sau:
- Cú pháp đơn giản cho các trường hợp đơn giản và phổ biến.
- Bất kỳ đường dẫn nào có thể xuất hiện trong tài liệu XML và bất kỳ tập hợp điều kiện nào cho các node trong đường dẫn đều có thể được chỉ định
- Bất kỳ nút nào trong tài liệu XML đều có thể được xác định duy nhất.
XPath được thiết kế để sử dụng trong nhiều ngữ cảnh. Nó được áp dụng để cung cấp các liên kết đến các nút, để tìm kiếm các kho lưu trữ và cho nhiều ứng dụng khác.
Tài liệu XML trong XPath
XPath có một số kiểu node như sau:
- Root : Cây XPath có một node gốc duy nhất chứa tất cả các node khác trong cây
- Element : Mỗi phần tử trong tài liệu có một node phần tử tương ứng xuất hiện trong cây bên dưới node gốc, Trong một node phần tử xuất hiện tất cả các loại node tương ứng khác.
- Attribute : Mỗi nút phần tử có một tập hợp các node thuộc tính được liên kết; phần tử là cha của mỗi nút thuộc tính này. Tuy nhiên, một node thuộc tính không phải là node con của phần tử cha của nó.
- Text : Dữ liệu ký tự được nhóm thành các node văn bản. Các ký tự bên trong nhận xét, hướng dẫn xử lý và giá trị thuộc tính không tạo ra các node văn bản. Node văn bản có một node cha và nó cũng có thể là node con.
- Comment : Có một nút nhận xét cho mọi nhận xét, ngoại trừ bất kỳ nhận xét nào xảy ra trong khai báo loại tài liệu. Nhận xét: nút có một nút cha và nó cũng có thể là nút con.
- Processing instruction : Có một nút hướng dẫn xử lý cho mọi Processing instruction, ngoại trừ mọi hướng dẫn xử lý xảy ra trong khai báo loại tài liệu. Processing instruction có node cha. nút và nó cũng có thể là nút con.
- Namespace : Mỗi phần tử có một tập hợp các nút không gian tên được liên kết. Mặc dù nút không gian tên có nút cha, nhưng nút không gian tên không được coi là con của nút cha vì chúng không được chứa trong cha. nút, nhưng được sử dụng để cung cấp thông tin mô tả về nút cha của chúng.
Node Type | String Value | Expanded Name |
root | Được xác định bằng cách nối các giá trị chuỗi của tất cả các phần tử con của nút văn bản theo thứ tự tài liệu. | Không |
element | Được xác định bằng cách nối các giá trị chuỗi của tất cả các phần tử con của nút văn bản theo thứ tự tài liệu. | Thẻ phần tử, bao gồm tiền tố namespace (nếu có). |
attribute | Giá trị chuẩn hóa của thuộc tính. | Thẻ phần tử, bao gồm tiền tố namespace (nếu có) |
text | Dữ liệu ký tự chứa trong node văn bản | Không |
comment | Nội dung của comment (không bao gồm ) | Không |
processing instruction | Phần của hướng dẫn xử lý tuân theo mục tiêu và bất kỳ khoảng trắng nào | Mục tiêu của hướng dẫn xử lý. |
namespace | URI của namespace | Tiền tố của namespace |
Biểu diễn XPath
Một truy vấn XPath hoạt động trên một tài liệu XML được định dạng tốt (well-form document) sau khi nó đã được phân tích cú pháp thành một cấu trúc cây.
Ví dụ cấu trúc XML
Cấu trúc cây XPath tương ứng:
Toán tử trong XPath
Một biểu thức XPath trả về một tập hợp node, một giá trị logic, một chuỗi hoặc một số. XPath cung cấp các toán tử số học dấu phẩy động cơ bản và một số toán tử so sánh và boolean.
Các biểu thức XPath được xây dựng bằng cách sử dụng các toán tử và ký tự đặc biệt như trong bảng dưới:
Toán tử | Mô tả |
/ | Toán tử con; chọn con ngay lập tức của danh sách bên trái |
// | Đệ quy gốc; tìm kiếm phần tử được chỉ định ở bất kỳ độ sâu nào |
. | Cho biết bối cảnh hiện tại |
.. | Phần tử cha của node ngữ cảnh hiện tại |
* | Ký tự đại diện (wildcard); chọn tất cả các phần tử bất kể tên phần tử |
@ | Thuộc tính; tiền tố cho một tên thuộc tính |
: | Dấu tách namespace, tách tiền tố namespace khỏi phần tử hoặc tên thuộc tính |
Ví dụ của toán tử Xpath
Biểu thức | Đề cập tới |
Author/FirstName | Tất cả các phần tử trong phần tử của nút ngữ cảnh hiện tại |
Bookstore//Title | Tất cả các phần tử <Title> một hoặc nhiều cấp nằm sâu trong phần tử <Bookstore> |
Bookstore//Book/Excerpt//Work | Tất cả các phần tử <Work> ở bất kỳ đâu bên trong phần tử con <Excerpt> nằm trong phần tử <Book> nằm ở bất kỳ đâu trong phần tử <Bookstore> |
.//Title | Tất cả các phần tử một hoặc nhiều cấp độ sâu trong ngữ cảnh hiện tại |
Ngoài ra, danh sách các toán tử có thể được sử dụng trong biểu thức XPath biểu diễn như sau:
Toán tử | Mô tả | Ví dụ | Giá trị trả về |
| | Tính hai tập hợp node | //book | //cd | Trả một tập hợp node với tất cả các phần tử book và cd, |
+ | Cộng | 20+10 | 30 |
– | Trừ | 20-10 | 10 |
* | Nhân | 2*4 | 8 |
div | Chia (division) | 28div14 | 2 |
= | Bằng | price=8.5 | Trả về true nếu price = 8.5 Trả về false nếu price khác 8.5 |
!= | Khác | price!=8.5 | Trả về true nếu price khác 8.5 Trả về false nếu price = 8.5 |
< | Nhỏ hơn | price<8.5 | Trả về true nếu price nhỏ hơn 8.5 Trả về false nếu price không nhỏ hơn 8.5 |
<= | Nhỏ hơn hoặc bằng | price<=8.5 | Trả về true nếu price nhỏ hoặc bằng hơn 8.5 Trả về false nếu price lớn hơn 8.5 |
> | Lớn hơn | price>8.5 | Trả về true nếu price lớn hơn 8.5 Trả về false nếu price nhỏ hơn hoặc bằng 8.5 |
>= | Lớn hơn hoặc bằng | price>=8.5 | Trả về true nếu price lớn hơn hoặc bằng 8.5 Trả về false nếu price nhỏ hơn 8.5 |
or | Hoặc | price=8.5 or price=9.0 | Trả về true nếu price = 8.5 hoặc price = 9.0 |
and | Và | price>8.5 and price<9.0 | Trả về true nếu price > 8.5 và price < 9.0 |
mod | Chia lấy dư | 15 mod 4 | 3 |
Các loại đối sánh/so khớp
XPath được sử dụng để tạo các mẫu. Thuộc tính match của phần tử xsl:template hỗ trợ một cú pháp phức tạp cho phép thể hiện chính xác những node nào sẽ được so khớp. Thuộc tính select của xsl:apply-templates, xsl:value-of, xsl:for-each, xsl:copy-of, và xsl:sort hỗ trợ siêu tập hợp cú pháp này thậm chí còn mạnh mẽ hơn, cho phép thể hiện chính xác các node được chọn và node không được chọn.
Một số loại so khớp quan trọng là:
So khớp theo tên
Các phần tử nguồn được xác định đơn giản bằng tên của nó, sử dụng thuộc tính match. Giá trị được cung cấp cho thuộc tính khớp được gọi là pattern (mẫu so khớp).
Cú pháp:
<xsl:template match="ElementName">
Mẫu trên sẽ so khớp với bất kỳ phần tử nào tên là <ElementName>
So khớp theo tổ tiên
Cú pháp:
<xsl:template match="P//EM">
Như ví dụ trên, một kết quả khớp có thể được thực hiện bằng cách sử dụng tổ tiên của phần tử. Thẻ sau sẽ khớp với bất kỳ phần tử EM nào có ‘P’ là tổ tiên/nguồn gốc.
So khớp theo tên phần tử
Mẫu cơ bản nhất chứa một tên phần tử khớp với tất cả các phần tử có tên đó. Mã sau minh họa ví dụ. Template này so khớp với Product. và đánh dấu đậm Product_ID con của chúng.
Cú pháp:
<xsl:template match="Product">
<xsl:value-of select="Product_ID" />
</xsl:template>
So khớp theo phần tử gốc
Để cho phép tất cả các node con kế thừa các thuộc tính trên phần tử gốc của tài liệu, hãy sử dụng một dấu gạch chéo phía trước để biểu thị phần tử gốc.
<xsl:template match="/"></xsl:template>
Nó sẽ truy vấn tới phần tử gốc
So khớp theo thuộc tính
Cú pháp:
<xsl:template match="element_name|['attribute' (attribute-name)=attribute_value]">
</xsl:template>
Cú pháp này sử dụng dấu ngoặc vuông để giữ tên và giá trị thuộc tính.
Ví dụ:
<xsl:template match="Product[@attributename=attributevalue]">
</xsl:template>
Các hàm và biểu thức XPath
Biểu thức XPath
Biểu thức XPath là các câu lệnh có thể trích xuất thông tin hữu ích từ cây XPath. Thay vì chỉ tìm các nút, người ta có thể đếm chúng, cộng các giá trị số, so sánh các chuỗi, v.v. Chúng giống như các câu lệnh trong ngôn ngữ lập trình chức năng. Mỗi biểu thức XPath đánh giá một giá trị duy nhất.
Có bốn loại biểu thức trong XPath. Đó là:
Node-set
Tập hợp nút là một nhóm node không có thứ tự từ tài liệu đầu vào khớp với tiêu chí của biểu thức.
Boolean
Một biểu thức boolean có một trong hai giá trị: true hoặc false. XSLT cho phép bất kỳ loại dữ liệu nào được chuyển đổi thành boolean. Điều này thường được thực hiện một cách ngầm định khi một chuỗi hoặc một số hoặc một tập hợp node được sử dụng ở nơi mà một boolean được mong đợi.
Number
XPath number là các giá trị số hữu ích để đếm các nút và thực hiện phép tính số học đơn giản. Các số như 43 hoặc ~7000 trông giống như số nguyên được lưu trữ dưới dạng double. Các giá trị không phải là số, chẳng hạn như chuỗi và boolean, được tự động chuyển đổi thành số khi cần thiết.
String
Chuỗi là một chuỗi gồm 0 hoặc nhiều ký tự Unicode. Các loại dữ liệu khác có thể được chuyển đổi thành chuỗi bằng cách sử dụng hàm string().
Lưu ý: Cú pháp biểu thức XPath bao gồm các dạng chữ cho chuỗi và số cũng như các hàm của toán tử để thao tác cả bốn loại dữ liệu XPath.
Hàm XPath
XPath xác định các chức năng khác nhau cần thiết cho XPath 2.0, XQuery 1.0 và XSLT 2.0. Các chức năng khác nhau ae Accessor, AnyURT, Node, Error and Trace, Sequence, Context, Boolean, Duration/Date/Time, String, QName và Numeric.
Các hàm Ngôn ngữ Đường dẫn XML (XPath) có thể được sử dụng để tinh chỉnh các truy vấn XPath và nâng cao sức mạnh lập trình cũng như tính linh hoạt của XPath. Mỗi hàm trong thư viện hàm được chỉ định bằng cách sử dụng nguyên mẫu hàm cung cấp kiểu trả về, tên hàm và kiểu đối số. Nếu một loại đối số được theo sau bởi một dấu chấm hỏi, đối số là tùy chọn; mặt khác, đối số là bắt buộc. Tên hàm phân biệt chữ hoa chữ thường.
Tiền tố mặc định cho namespace hàm là fn.
Hàm note-set
Các hàm tập hợp nút nhận một đối số node-set. Những thứ này trả về một tập hợp nút hoặc thông tin về một nút cụ thể trong một tập hợp node. Các hàm thiết lập nút khác nhau là name(), local-name(), namespace-uri() và root().
Cú pháp:
name()
fn:name()
fn:name(nodeset)
local-name()
fn:local-name()
fn:local-name(nodeset)
namespace-uri()
fn:namespace-uri()
fn:namespace-uri(nodeset)
root()
fn:root()
fn:root(node)
Trong đó:
name()
Hàm trả về tên của nút hiện tại hoặc nút đầu tiên trong note-set đã chỉ định.
local-name()
Hàm trả về tên của node hiện tại hoặc node đầu tiên trong tập hợp node được chỉ định mà không có tiền tố namespace
namespace-uri()
Hàm trả về URI không gian tên của nút hiện tại hoặc nút đầu tiên trong node-set.
root()
Hàm trả lại gốc của cây mà nút hiện tại hoặc node được chỉ định thuộc về. Đây thường sẽ là một node tài liệu.
Ví dụ:
Tạo file book.xml
<?xml-stylesheet href="book.xsl" type="text/xsl"?>
<Catalog xmlns="http://wwww.web888.vn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://hocvietcode.com book.xsd">
<Book>
<Author>Gambardella Mathew</Author>
<Title>XML Developer's Guide</Title>
<Genre>Computer</Genre>
<Price>44.95</Price>
<PublishDate>2000-10-01</PublishDate>
<Description>An in-depth look at creating applications with XML.</Description>
</Book>
</Catalog>
Tạo file book.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://hocvietcode.com" xmlns="https://hocvietcode.com"
elementFormDefault="qualified">
<!-- Definination for simple elements -->
<xs:element name="Author" type="xs:string"/>
<xs:element name="Title" type="xs:string"/>
<xs:element name="Genre" type="xs:string"/>
<xs:element name="Price" type="xs:decimal"/>
<xs:element name="PublishDate" type="xs:string"/>
<xs:element name="Description" type="xs:string"/>
<!-- Definination for complex elements -->
<xs:element name="Book">
<xs:complexType>
<xs:sequence>
<xs:element ref="Author"/>
<xs:element ref="Title"/>
<xs:element ref="Genre"/>
<xs:element ref="Price"/>
<xs:element ref="PublishDate"/>
<xs:element ref="Description"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Catalog">
<xs:complexType>
<xs:sequence>
<xs:element ref="Book" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Tạo file book.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:template match="/">
<html>
<body>
<h2>Books</h2>
<table border="1">
<tr>
<td>
<b>namespace-uri()</b>
</td>
<td>
<b>name()</b>
</td>
<td>
<b>local-name()</b>
</td>
<td>
<b>text()</b>
</td>
</tr>
<xsl:apply-templates />
</table>
</body>
</html>
</xsl:template>
<xsl:template match="*">
<tr>
<td>
<xsl:value-of select="namespace-uri()" />
</td>
<td>
<xsl:value-of select="name()" />
</td>
<td>
<xsl:value-of select="local-name()" />
</td>
<td>
<xsl:value-of select="text()" />
</td>
</tr>
<xsl:apply-templates select="*" />
</xsl:template>
</xsl:stylesheet>
Output:
Hàm boolean
Cú pháp Ngôn ngữ Đường dẫn XML (XPath) hỗ trợ các hàm boolean trả về giá trị true hoặc false và có thể được sử dụng với các toán tử so sánh trong các mẫu phù hợp hơn. Một số hàm này là boolean, not, true và false.
boolean(arg)
Cú pháp:
fn:boolean(args)
Ví dụ:
Tạo file boolean.xml:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="boolean.xsl" type="text/xsl"?>
<RootElement>
<Booleann>
<ChildElm>
</ChildElm>
</Booleann>
</RootElement>
Tạo file boolean.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="Booleann">
<html>
<body>
<ul>
<li><b>boolean(0)</b> = <xsl:value-of select="boolean(0)" /></li>
<li><b>boolean(1)</b> = <xsl:value-of select="boolean(1)" /></li>
<li><b>boolean(-100)</b> = <xsl:value-of select="boolean(-100)" /></li>
<li><b>boolean('hello')</b> = <xsl:value-of select="boolean('hello')" /></li>
<li><b>boolean('')</b> = <xsl:value-of select="boolean('')" /></li>
<li><b>boolean(//book)</b> = <xsl:value-of select="boolean(//book)" /></li>
<li><b>boolean(//ChildElm)</b> = <xsl:value-of select="boolean(//ChildElm)" /></li>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Output:
not(arg)
Ý nghĩa của một phép toán có thể được đảo ngược bằng cách sử dụng hàm not()
Cú pháp:
fn:not(arg)
Ví dụ: Quy tắc mẫu này chọn tất cả các thành phần Product không phải là con đầu tiên của cha mẹ chúng:
<xsl:template match="PRODUCT[not(position()=1)]">
<xsl:value-of select="." />
</xsl:template>
Thay vào đó, quy tắc mẫu tương tự có thể được viết bằng cách sử dụng toán tử không bằng !=:
<xsl:template match="PRODUCT[position() !=1]">
<xsl:value-of select="." />
</xsl:template>
true()
Hàm true() trả về giá trị boolean true.
Cú pháp:
fn:true()
Ví dụ:
<xsl:value-of select="true()" />
false()
Hàm false() trả về giá trị boolean false.
Cú pháp:
fn:false()
Ví dụ:
<xsl:value-of select="true() or false()" />
<xsl:value-of select="true() and false()" />
<xsl:value-of select="false() and false()" />
Output:
true
false
false
Giá trị nhận được từ một biểu thức phụ thuộc vào một số quy tắc như trong bảng:
Loại biểu thức | Quy tắc |
node-set | true nếu tập hợp chứa ít nhất một node, sai nếu nó trống. |
string | true trừ khi chuỗi có độ dài bằng 0. |
number | true trừ khi giá trị là Zero hoặc NaN (không phải là số). |
Result tree fragment | Luôn luôn đúng, bởi vì mỗi phân đoạn chứa ít nhất một node, node gốc của nó. |
Một số toán tử so sánh các giá trị số để đạt được giá trị Boolean. Tất cả các nút trong tập hợp nút đều được kiểm tra để xác định xem có bất kỳ nút nào trong số chúng thỏa mãn sự so sánh hay không. Các toán tử so sánh được hiển thị trong bảng:
Toán tử | Trả về |
expr and expr | True nếu cả hai biểu thức (chuỗi hoặc số) có cùng giá trị, ngược lại là sai. |
expr or expr | True nếu các biểu thức không có cùng giá trị (chuỗi hoặc số), ngược lại là sai. |
true() | True |
false() | False |
not(expr) | True nếu giá trị của biểu thức số đầu tiên Lớn hơn giá trị của biểu thức số thứ hai, ngược lại là sai. |
Hàm Numeric
Cú pháp XPath hỗ trợ các hàm số lấy lại các chuỗi hoặc số và có thể được sử dụng với các toán tử so sánh trong các mẫu bộ lọc. Các hàm số khác nhau là number(arg), floor(num) and round(num)
Các quy tắc để chuyển đổi bất kỳ biểu thức nào thành giá trị số được liệt kê trong bảng:
Loại biểu thức | Quy tắc |
Node-set | Node đầu tiên được chuyển đổi thành một chuỗi, sau đó quy tắc chuyển đổi chuỗi được sử dụng. |
Boolean | Giá trị true được chuyển thành số 1 và false thành số 0. |
String | Nếu chuỗi là sự tuần tự hóa theo nghĩa đen của một số (ví dụ: -123,5), thì chuỗi đó sẽ được chuyển đổi thành số đó. Nếu không, giá trị NaN được sử dụng. |
Result tree fragment | Giống như các tập hợp nút, một đoạn cây kết quả được chuyển đổi thành một chuỗi, sau đó được chuyển đổi theo quy tắc chuỗi. |
Để thao tác các giá trị số, có nhiều toán tử và hàm khác nhau như trong bảng:
Hàm | Trả về |
expr + expr | Tổng của hai biểu thức số. |
expr – expr | Hiệu của 2 biểu thức số |
expr * expr | Tích của 2 biểu thức số |
expr div expr | Thương của 2 số |
expr mod expr | Kết quả dư của phép chia lấy dư 2 số |
round(expr) | Giá trị của biểu thức được làm tròn đến số nguyên gần nhất. |
sum(node-set) | Tổng giá trị của các node trong tập hợp node . Không giống như các chức năng khác trong bảng này, chức năng này hoạt động trên một tập hợp node thay vì các biểu thức |
Cú pháp:
number(arg)
fn:number(arg)
ceiling(num)
fn:ceiling(arg)
floor(num)
fn:floor(arg)
round(num)
fn:round(arg)
Trong đó:
number(arg)
Hàm trả về giá trị số của đối số. Đối số có thể là một boolean, một chuỗi hoặc một tập hợp node.
ceiling(num)
Hàm trả về số nguyên nhỏ nhất lớn hơn đối số truyền vào (làm tròn lên).
round(num)
Hàm trả về số nguyên làm tròn dựa theo phần thập phân đối số (làm tròn lên hoặc xuống tùy theo số thực).
Ví dụ:
Tạo file numbericfunction.xml
<?xml version="1.0"?>
<?xml-stylesheet href="numbericfunction.xsl" type="text/xsl"?>
<NumberList xmlns="http://wwww.web888.vn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://hocvietcode.com numbericfunction.xsd">
<NumberElement></NumberElement>
</NumberList>
Tạo file numbericfunction.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://hocvietcode.com" xmlns="https://hocvietcode.com"
elementFormDefault="qualified">
<xs:element name="NumberElement" type="xs:decimal" />
<xs:element name="NumberList">
<xs:complexType>
<xs:sequence>
<xs:element ref="NumberElement" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Tạo file numbericfunction.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="/">
<html>
<body>
<h3>Numeric functions</h3>
<ul>
<li>
<b>number('-1548') = <xsl:value-of select="number('-1548')" /></b>
</li>
<li>
<b>number('text') = <xsl:value-of select="number('text')" /></b>
</li>
<li>
<b>number('20.5' div '5') = <xsl:value-of select="number('20.5' div '5')" /></b>
</li>
<li>
<b>ceiling('2.5') = <xsl:value-of select="ceiling('2.5')" /></b>
</li>
<li>
<b>round('3.4') = <xsl:value-of select="round('3.4')" /></b>
</li>
<li>
<b>round('-0.6') = <xsl:value-of select="round('-0.6')" /></b>
</li>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Output:
Hàm string
Các hàm chuỗi được sử dụng để đánh giá, định dạng và thao tác các đối số chuỗi hoặc để chuyển đổi một đối tượng thành một chuỗi. Các hàm Chuỗi khác nhau được hiển thị trong bảng:
Function | Returns |
concat(string,string,…) | Một chuỗi là nối của các đối số. |
format-number(number,pattern,decimal-format) | Một chuỗi chứa số, được định dạng theo mẫu. Đối số định dạng thập phân tùy chọn trỏ đến một khai báo định dạng gán các ký tự đặc biệt, chẳng hạn như ký tự nhóm, phân tách các nhóm Chữ số với số lượng lớn để dễ đọc. |
normalize-space(string) | Chuỗi có khoảng trắng ở đầu và theo dõi đã bị xóa và tất cả các ký tự khoảng trắng khác được thay thế bằng khoảng trắng đơn. |
substring(string, offset, range) | Một chuỗi con của đối số chuỗi, phần bù bắt đầu, các ký tự từ đầu và các ký tự phạm vi kết thúc từ phần bù. |
substring-after(string, to-match) | Một chuỗi con của đối số chuỗi, bắt đầu ở cuối lần xuất hiện đầu tiên của chuỗi khớp và kết thúc ở cuối chuỗi. |
substring-before(string, to-match) | Một chuỗi con của đối số chuỗi, bắt đầu ở đầu chuỗi và kết thúc ở đầu lần xuất hiện đầu tiên của chuỗi khớp. |
translate(string, characters-to-match, characters-replace-with) | Chuỗi có tất cả các ký tự trong chuỗi ký tự khớp được thay thế bằng các ký tự đối ứng của chúng trong chuỗi ký tự thay thế bằng. |
Một số hàm hoạt động trên chuỗi và trả về giá trị số hoặc Boolean, được liệt kê trong bảng
Function | Returns |
contain(string,sub) | true nếu chuỗi con đã cho xảy ra trong chuỗi, nếu không thì false. |
starts-with(string, sub) | true nếu chuỗi bắt đầu bằng chuỗi con, ngược lại |
string-length(string) | Độ dài của chuỗi |
Cú pháp:
string(arg)
fn:string(arg)
translate()
fn:translate(string, string, string)
concat()
fn:concat(string,string,...)
substring()
fn:substring(string,start,len)
fn:substring(string,start)
Ví dụ:
Tạo file bookstore.xml:
<?xml-stylesheet href="bookstore.xsl" type="text/xsl"?>
<Booksotre>
<Book>
<Author>Toanngo92</Author>
<Title>XML Developer's Guide</Title>
<Price>44.95</Price>
</Book>
<Book>
<Author>Toanngo922</Author>
<Title>Java Developer's Guide</Title>
<Price>44.00</Price>
</Book>
<Book>
<Author>Toanngo923</Author>
<Title>Javascript Developer's Guide</Title>
<Price>44.00</Price>
</Book>
</Booksotre>
Tạo file bookstore.xsl
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:value-of select='translate("-------------------Bboks-------------------", "bok", "ook")'/>
<br/>
<xsl:value-of select="concat('String 1','string 2')" />
<xsl:apply-templates select="//Book" />
</body>
</html>
</xsl:template>
<xsl:template match="Book">
<xsl:if test="contains(Title,'Java')">
<div>
<B>
<xsl:value-of select="Title" />
</B>
by
<i>
<xsl:value-of select="Author" />
</i>
cost <xsl:value-of select="Price" />
</div>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Output:
Result Tree Fragments
Đoạn cây kết quả là một phần của tài liệu XML không phải là một node hoặc tập hợp các node hoàn chỉnh.
Hoạt động được phép duy nhất trong một đoạn cây kết quả là trên một chuỗi. Hoạt động trên chuỗi có thể liên quan đến việc chuyển đổi chuỗi đầu tiên thành một số hoặc boolean. Đoạn cây kết quả là một loại dữ liệu bổ sung ngoài bốn loại dữ liệu XPath cơ bản (chẳng hạn như chuỗi, số, boolean, tập hợp node).
Một đoạn cây kết quả đại diện cho một đoạn của cây kết quả. Đặc biệt, không được phép sử dụng các toán tử /,// và [] XPath trên các đoạn cây Kết quả,
Làm việc với các Style khác nhau
Chuyển đổi là một trong những kỹ thuật quan trọng và hữu ích nhất để làm việc với XML. XML có thể được biến đổi bằng cách thay đổi cấu trúc, cách đánh dấu và có lẽ cả nội dung của nó sang một dạng khác. Lý do phổ biến nhất để chuyển đổi XML là mở rộng phạm vi tiếp cận của tài liệu sang các lĩnh vực mới bằng cách chuyển đổi nó thành định dạng trình bày.
Một số cách sử dụng transformation là:
- Định dạng tài liệu để tạo định dạng trình bày chất lượng cao.
- Thay đổi từ vựng XML này sang từ vựng XML khác.
- Trích xuất các mẩu thông tin cụ thể và định dạng chúng theo cách khác.
- Thay đổi một thể hiện của XML thành text
- Định dạng lại hoặc tạo nội dung.
Lưu ý: transformation có thể được sử dụng để thay đổi nội dung, chẳng hạn như trích xuất một phần tử. Nó thậm chí có thể được sử dụng để lọc một tài liệu XML để thay đổi nó theo những cách rất nhỏ, chẳng hạn như chèn một thuộc tính vào một loại phần tử cụ thể.
Chuyển đổi bằng Bộ xử lý XSLT
Bộ xử lý XSLT lấy hai thứ làm đầu vào: biểu định kiểu XSLT để quản lý quá trình chuyển đổi và tài liệu đầu vào được gọi là cây nguồn. Đầu ra được gọi là cây kết quả.
Công cụ XSLT bắt đầu bằng cách đọc trong biểu định kiểu XSLT và lưu vào bộ nhớ cache dưới dạng bảng tra cứu. XPath định vị các phần của tài liệu XML chẳng hạn như node Phần tử, node Thuộc tính và node Văn bản. Do đó, đối với mỗi node mà XSLT xử lý, nó sẽ tìm trong bảng để áp dụng quy tắc khớp tốt nhất. Bắt đầu từ nút gốc, công cụ XSLT tìm các quy tắc, thực thi chúng và tiếp tục cho đến khi không còn node nào trong node ngữ cảnh của nó được thiết lập để hoạt động. Tại thời điểm đó, quá trình xử lý hoàn tất và công cụ XSLT xuất tài liệu kết quả.
Chuyển đổi XML bằng XSLT
Bước 1: tạo file XML
<?xml version="1.0" encoding="UTF-8"?>
Bước 2: tạo file xsl
<xsl:xml-stylesheet xmlns:xsl="http://www.w4.org/1999/XSL/Transform" version="1.0">
</xsl:xml-stylesheet>
Bước 3: triển khai output như các ví dụ bên trên
<xsl:stylesheet><xsl:output method="html"/>...</xsl:stylesheet>
Để xuất bất kỳ nội dung nào ngoài XML được định dạng tốt, nên sử dụng thẻ <xsl:output>giống như thẻ được hiển thị, chỉ định “text” hoặc “xml”.
Bài tập
Tạo XML và XSLT để quản lý danh sách nhân viên và phòng ban
Cho biết cấu trúc XML như sau:
<company>
<department>
<departmentID>D001</departmentID>
<departmentName>Human Resources</departmentName>
<employees>
<employee>
<employeeID>E001</employeeID>
<employeeName>John Doe</employeeName>
<position>Manager</position>
<contact>
<email>john.doe@example.com</email>
<phone>123-456-7890</phone>
</contact>
<salary currency="USD">75000</salary>
<hireDate>2015-08-01</hireDate>
</employee>
<employee>
<employeeID>E002</employeeID>
<employeeName>Jane Smith</employeeName>
<position>Assistant</position>
<contact>
<email>jane.smith@example.com</email>
<phone>098-765-4321</phone>
</contact>
<salary currency="USD">50000</salary>
<hireDate>2018-04-15</hireDate>
</employee>
</employees>
</department>
<department>
<departmentID>D002</departmentID>
<departmentName>IT</departmentName>
<employees>
<employee>
<employeeID>E003</employeeID>
<employeeName>Alice Brown</employeeName>
<position>Developer</position>
<contact>
<email>alice.brown@example.com</email>
<phone>456-789-0123</phone>
</contact>
<salary currency="USD">90000</salary>
<hireDate>2017-10-05</hireDate>
</employee>
</employees>
</department>
</company>
- Sử dụng XSD để validate dữ liệu trên
- Sử dụng xslt để xuất dữ liệu ra dạng HTML table.