text:
Xem phim truyền hình gần đây, sẽ thấy rất nhiều cảnh quay được thực hiện tại Đà Lạt: Mưa thủy tinh, Tường vi cánh mỏng, Có lẽ nào ta yêu nhau, Những cuộc tình trắng đen, Sắc đẹp và danh vọng, Tiếng dương cầm trên biển, Lối sống sai lầm, Thẩm mỹ viện, Định mệnh, Lâu đài tình ái, Đời, Đối mặt… Sắp tới còn có Thụy khúc (phát sóng vào 22.8), Lục lạc huyền bí (đang làm hậu kỳ) hoặc Những đóa hoa tình yêu vừa khởi quay cũng có bối cảnh chính ở Đà Lạt…
Theo đạo diễn Mỹ Khanh (phim Lục lạc huyền bí), Đà Lạt là địa điểm được các đạo diễn nhắm đến đầu tiên vì “so với nhiều tỉnh thành khác, giá sinh hoạt ở Đà Lạt khá rẻ, lại dễ tìm bối cảnh. Chưa kể, dù những nơi khác đang nắng gắt thì khí hậu ở Đà Lạt vẫn dễ chịu nhất. Điều này tác động không nhỏ đến sức khỏe, tâm lý của diễn viên. Bởi khi cảm thấy thoải mái, thậm chí phơi phới vì trời mây thoáng đãng, các bạn sẽ nhiệt tình, hết mình chăm chút cho vai diễn hơn…”. Lý do này có thể nói, hoàn toàn chính xác, vì đâu phải diễn viên nào cũng đều biết Đà Lạt! Nên cảm giác lần đầu tiên đến thành phố từng được ca tụng là thành phố ngàn hoa, thành phố sương mù, thành phố trong rừng hay thiên đường du lịch... có lẽ sẽ tạo cho người ta nhiều cảm xúc hơn. Đạo diễn Võ Tấn Bình (từng làm phim Hoa dã quỳ tại Đà Lạt) thì cho rằng, khi chọn phố núi quay phim, anh “có thể thực hiện được những cảnh quay đẹp và có hồn hơn”.
“Tôi nghĩ Đà Lạt là nơi cái đẹp vẫn còn sót lại, và nó còn như một đại phim trường”
Đạo diễn Trần Mỹ Hà
Nhiều đạo diễn khác cũng có ý kiến rằng, nếu lên Đà Lạt, ngoài những ưu điểm: phong cảnh hữu tình, nên thơ, lãng mạn… hay điều kiện cần: nhân vật có liên quan đến Đà Lạt…, đoàn phim sẽ rút được một khoảng thời gian đáng kể vì quay ở TP.HCM vừa kẹt xe, bối cảnh chật chội, riêng chuyện di chuyển đã thấy vất vả… Chưa kể, khi đến Đà Lạt (hoặc nơi nào đó ngoài TP.HCM), các diễn viên sẽ dễ dàng “tập trung chuyên môn” cho phim hơn, thay vì phải phân tâm việc gia đình hoặc chạy show phim khác chẳng hạn.
Chính vì những thuận lợi cho cả nhà sản xuất, đạo diễn và diễn viên ấy, nên xem phim sẽ thấy rất nhiều nhân vật hễ có đi du lịch hoặc hẹn hò lãng mạn thì nơi đó thường là Đà Lạt, có yếu tố Hàn Quốc cũng sẽ thấy Đà Lạt (những phim Việt hóa), rồi có những cảnh tai nạn giao thông cũng phải tông-té ở Đà Lạt (vì nhiều dốc đèo)…
Nhưng dù phim quay ở Đà Lạt nhiều như vậy, lại thấy rất ít kịch bản dành riêng về con người, văn hóa… nơi đây, mà hầu hết chỉ là những lồng ghép hoặc một giai đoạn nào đó của các nhân vật. Trước đây có một số phim nhưng đều bị độc giả và người Đà Lạt phản ứng vì “không giống mình”. Chỉ mới đây nhất, đang phát sóng bộ phim khá đậm chất Đà Lạt (vì câu chuyện phim ở Đà Lạt) có lẽ là Đời (đạo diễn Trần Mỹ Hà). Bởi trong phim Đời, lần đầu tiên tiếng K’Ho được lên phim (có phụ đề tiếng Việt), cả những giai điệu dân ca của dân tộc Lạch rất hiếm khi được nghe… bên cạnh những vẻ đẹp quen thuộc thường thấy của Đà Lạt xưa và nay. Trong phim Những đóa hoa tình yêu đang quay, đạo diễn Lê Cung Bắc cũng cho biết sẽ cố gắng đi sâu vào mảnh đất, con người và nghề trồng hoa ở Đà Lạt, bên cạnh những thăng trầm của tình yêu trong phim… với mong muốn cùng mọi người làm cho thành phố du lịch này ngày càng đẹp hơn, nhưng còn phải chờ xem sao…
Nguyên Vân
"Soi" nhất cử nhất động của sao Việt (17/9)
Thời điểm vàng mua hàng Laptop
Ngưỡng mộ cô bé 4 tuổi biết nói 4 ngôn ngữ
Những cặp đôi "đũa lệch" về ngoại hình cực…
Những cặp sao hơn nhau hàng chục tuổi
BST đệm cao cấp nhất Việt Nam được bán tại…
Chánh Tín từ chối tiết lộ nhà mới sau khi ngân hàng thu nhà
Những 'gái làng chơi' quyến rũ, đình đám của phim Hollywood
11 mỹ nhân quyến rũ như gái đôi mươi ở tuổi trung niên
Những bạn trẻ giống người nổi tiếng giờ ra sao?
Phạm Băng Băng từ kín đáo đến sexy trong phim cổ trang
Tạo mục mới Top mục tự tạo
Nhúng Baomoi vào web của bạn
Thống kê & So sánh báo điện tử
Việc tổng hợp và sắp xếp các thông tin trên Báo Mới đều được thực hiện tự động bởi một chương trình máy tính.
Giấy phép số 46/GP-TTĐT cấp ngày 13/01/2012
Báo Mới có bản quyền thuộc Công ty Cổ phần Công nghệ EPI.


text:
Họp báo giữa Hillary Clinton và ngoại trưởng Trung Quốc cho thấy quan điểm khác biệt về vấn đề biển Đông và bạo loạn ở Syria.
Bạn cần mở JavaScript lên và cài phần mềm Flash Player mới nhất để nghe/xem.
Bấm vào đây để tải Flash Player mới nhất
Ngoại trưởng Mỹ Hillary Clinton và Dương Khiết Trì, ngoại trưởng Trung Quốc, bày tỏ quan điểm khác biệt của hai nước về tranh chấp biển Đông và bạo loạn ở Syria.
Về tranh chấp biển Đông, đại diện của Hoa Kỳ tuyên bố không đứng về bất kỳ phía nào mà chỉ ủng hộ cho việc duy trì hòa bình, ổn định.
Còn ngoại trưởng Trung Quốc tuyên bố 'cần có thương lượng trực tiếp và thân thiện' về những lợi ích 'chồng chéo' của các quốc gia cùng tuyên bố chủ quyền với đảo Nam Sa.
Phía Hoa Kỳ cho rằng động thái của Trung Quốc và Nga trong vấn đề Syria đã gây 'khó khăn cho những nỗ lực tìm ra giải pháp của Hội đồng Bảo an Liên Hiệp Quốc'.
Đáp lại, ông Dương Khiết Trì nói, Trung Quốc tôn trọng giai đoạn 'chuyển đổi chính trị ở Syria', và cách giải quyết phải được xuất phát từ chính người dân Syria.
Cuối buổi họp báo bà Clinton cũng nói về ảnh hưởng tích cực của Trung Quốc tới Triều Tiên.
Ngoại trưởng Mỹ cho rằng có cơ hội để giới lãnh đạo mới của Triều Tiên cải thiện đời sống người dân.
Trước cuộc họp báo, bà Hillary Clinton đã gặp lãnh đạo tối cao của đảng Cộng sản Trung Quốc, ông Hồ Cẩm Đào.
Phó Chủ tịch Tập Cận Bình, người được trông đợi sắp lên lãnh đạo Trung Quốc, đã hủy cuộc gặp với Ngoại trưởng Mỹ Hillary Clinton mà không rõ nguyên do.
BBC © 2014 BBC không chịu trách nhiệm về nội dung các trang bên ngoài.
Trang này hiển thị tốt nhất với phần mềm lướt mạng có mở CSS. Nếu không có chức năng này, hoặc phần mềm cũ, bạn vẫn đọc được nội dung trên trang này nhưng không tận dụng được hết các chức năng. Nếu có thể hãy nghĩ đến chuyện nâng cấp phần mềm hoặc mở CSS lên.

markdown:
Họp báo giữa Hillary Clinton và ngoại trưởng Trung Quốc cho thấy quan điểm khác biệt về vấn đề biển Đông và bạo loạn ở Syria.
Bạn cần mở JavaScript lên và cài phần mềm Flash Player mới nhất để nghe/xem.
[Bấm vào đây để tải Flash Player mới nhất](http://www.adobe.com/products/flashplayer/)
Ngoại trưởng Mỹ Hillary Clinton và Dương Khiết Trì, ngoại trưởng Trung Quốc, bày tỏ quan điểm khác biệt của hai nước về tranh chấp biển Đông và bạo loạn ở Syria.
Về tranh chấp biển Đông, đại diện của Hoa Kỳ tuyên bố không đứng về bất kỳ phía nào mà chỉ ủng hộ cho việc duy trì hòa bình, ổn định.
Còn ngoại trưởng Trung Quốc tuyên bố 'cần có thương lượng trực tiếp và thân thiện' về những lợi ích 'chồng chéo' của các quốc gia cùng tuyên bố chủ quyền với đảo Nam Sa.
Phía Hoa Kỳ cho rằng động thái của Trung Quốc và Nga trong vấn đề Syria đã gây 'khó khăn cho những nỗ lực tìm ra giải pháp của Hội đồng Bảo an Liên Hiệp Quốc'.
Đáp lại, ông Dương Khiết Trì nói, Trung Quốc tôn trọng giai đoạn 'chuyển đổi chính trị ở Syria', và cách giải quyết phải được xuất phát từ chính người dân Syria.
Cuối buổi họp báo bà Clinton cũng nói về ảnh hưởng tích cực của Trung Quốc tới Triều Tiên.
Ngoại trưởng Mỹ cho rằng có cơ hội để giới lãnh đạo mới của Triều Tiên cải thiện đời sống người dân.
Trước cuộc họp báo, bà Hillary Clinton đã gặp lãnh đạo tối cao của đảng Cộng sản Trung Quốc, ông Hồ Cẩm Đào.
Phó Chủ tịch Tập Cận Bình, người được trông đợi sắp lên lãnh đạo Trung Quốc, đã hủy cuộc gặp với Ngoại trưởng Mỹ Hillary Clinton mà không rõ nguyên do.
BBC © 2014
[BBC không chịu trách nhiệm về nội dung các trang bên ngoài.](/vietnamese/institutional/2009/02/000000_links.shtml) **Trang này hiển thị tốt nhất với phần mềm lướt mạng có mở CSS. Nếu không có chức năng này, hoặc phần mềm cũ, bạn vẫn đọc được nội dung trên trang này nhưng không tận dụng được hết các chức năng. Nếu có thể hãy nghĩ đến chuyện nâng cấp phần mềm hoặc mở CSS lên.**

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

Server: Apache

Vary: X-CDN

Cache-Control: no-cache="Set-Cookie"

Content-Type: text/html

Accept-Ranges: bytes

Connection: close

Set-Cookie: BBC-UID=b5e4a1595ee9cc136df9ae12b1eeb5c6b13d052ce0b07174a47f69262feeb0e70CCBot%2f2%2e0%20%28http%3a%2f%2fcommoncrawl%2eorg%2ffaq%2f%29; expires=Sun, 16-Sep-18 20:06:27 GMT; path=/; domain=bbc.co.uk;


text:
Vấn đề chất lượng và vệ sinh an toàn thực phẩm luôn là vấn đề quan tâm hàng đầu của nhà sản xuất và của mỗi người tiêu dùng. Bởi vì, theo xu thế hiện nay, người tiêu dùng ngày càng quan tâm tới sức khỏe và tính an toàn hơn là giá cả của sản phẩm, nhất là đối với các sản phẩm cao cấp.
Hiện nay, Công ty cổ phần CAFICO Việt Nam luôn được đánh giá xếp loại tốt về điều kiện đảm bảo vệ sinh an toàn thực phẩm, đã được cấp code EU. Cho đến nay, Công ty luôn nằm trong danh sách các doanh nghiệp được miễn kiểm tra của Nafiqaved vì chưa có lô hàng nào bị dư lượng hóa chất và kháng sinh cấm.
Sản phẩm của Công ty đã thâm nhập vào các thị trường lớn trên thế giới như Nhật, Úc, … Đây là các thị trường rất khó tính và chịu sự kiểm soát nghiêm ngặt về chất lượng và vệ sinh an toàn thực phẩm. Ý thức được điều này nên Công ty luôn chú trọng đến việc thực hiện các chương trình quản lý chất lượng sản phẩm.
Hệ thống quản lý chất lượng đang áp dụng :
Công ty đã và đang áp dụng chương trình quản lý chất lượng theo HACCP (Hệ thống phân tích mối nguy và kiểm soát các điểm tới hạn) vào sản xuất để đảm bảo chất lượng tốt nhất cho sản phẩm. Trong HACCP có các thủ tục vệ sinh và quy phạm sản xuất tốt nên giúp cho nhà chế biến loại bỏ được các mối nguy an toàn thực phẩm ra khỏi sản phẩm của mình.
Công ty có một phòng kiểm nghiệm vi sinh, phục vụ kiểm vi sinh thường xuyên nhằm hỗ trợ công tác quản lý chất lượng sản phẩm tại xí nghiệp.
Công ty đã thành lập tổ kỹ thuật sản xuất, đội HACCP, đội QC. Đây là lực lượng nòng cốt của xí nghiệp. Bộ phận này thường xuyên giám sát chất lượng sản phẩm, quy trình, quy phạm, quy cách mẫu mã sản phẩm và kiểm tra vi sinh trong suốt quá trình sản xuất.
Hàng năm, Công ty tổ chức định kỳ các khóa huấn luyện để nâng cao tay nghề cho công nhân, tổ chức các buổi sinh hoạt chuyên đề để củng cố và cập nhật kiến thức chuyên môn cho công nhân một cách thường xuyên, giáo dục cho công nhân luôn nâng cao ý thức trong việc chấp hành tốt tổ chức kỷ luật, tuân thủ đúng quy trình chế biến, quy phạm sản xuất, quy phạm vệ sinh, đảm bảo chất lượng sản phẩm và an toàn vệ sinh thực phẩm. Việc không ngừng nâng cao và cải thiện an toàn thực phẩm sẽ gia tăng đáng kể giá trị cho sản phẩm.
Mỗi một công nhân là một kiểm tra viên tự chịu trách nhiệm trên sản phẩm do mình tham gia thực hiện. Đây là yếu tố hết sức cơ bản để Công ty giữ vững được uy tín thương hiệu và chất lượng sản phẩm của mình.
Quá trình phát triển của Công ty qua nhiều năm đã tạo ra các sản phẩm cao cấp ngày càng phong phú và đa dạng. Nhờ vậy, đến nay Công ty luôn đáp ứng được ngày càng tốt hơn về nhu cầu và thị hiếu của nhiều khách hàng khó tính. Đó chính là nền tảng tạo hiệu quả và định hướng phát triển cho tương lai của Công ty.
Hướng dẫn tìm kiếm

Cache-Control: private

Content-Type: text/html; charset=utf-8


text:
Bảng giá vật tư
Tin tức điều hòa
Điều hòa Multi
Điều hòa âm trần
Điều hòa tủ đứng
Trang chủ
Điều hòa dân dụng
Điều hòa Daikin
Điều hòa Panasonic
Điều hòa Fujitsu
Điều hòa General
Điều hòa Mitsubishi
Điều hòa Mitsubishi Electric
Điều hòa LG
Điều hòa Midea
Điều hòa Toshiba
Điều hòa Carrier
Điều hòa Sumikura
Điều hòa Nagakawa
Điều hòa Funiki
Điều hòa Samsung
Hỗ Trợ Trực Tuyến
Kinh doanh 1
04.35149453 (10 lines)
Kinh doanh 2
0988257667
Dự án CT
0938161686
Kinh doanh 1
Kinh doanh 2
Dự án CT
Điều hòa Samsung | Điều hòa nhiệt độ Samsung
Điều hòa Samsung 2 chiều
Điều hòa Samsung AQ09ULN - 9.000 BTU - 2 Chiều
Model:
AQ09ULN
Công suất:9.000 BTU
Giá bán:7.800.000 VND
Điều hòa Samsung AQ12ULN - 12.000 BTU - 2 Chiều
Model:
AQ12ULN
Công suất:12.000 BTU
Giá bán:9.050.000 VND
Điều hòa Samsung AQ18UL - 18.000 BTU - 2 Chiều
Model:
AQ18UL
Công suất:18.000 BTU
Giá bán:13.400.000 VND
Điều hòa Samsung 1 chiều
Điều hòa Samsung AS09- 9.000 BTU - 1 Chiều
Model:
AS09
Công suất:9.000 BTU
Giá bán:6.500.000 VND
Điều hòa Samsung AS12 - 12.000 BTU - 1 chiều
Model:
AS12
Công suất:12.000 BTU
Giá bán:8.250.000 VND
Điều hòa Samsung AS18UW - Dòng MAX 1 chiều 18.000BTU/h
Model:
AS18
Công suất:18.000 BTU
Giá bán:12.000.000 VND
Điều hòa Samsung 9000 BTU
Điều hòa Samsung 12000 BTU
Điều hòa Samsung 18000 BTU
Sản phẩm mới nhất
Điều hòa Panasonic 2 chiều Inverter E12 PKH-8
Điều hòa Daikin 2 chiều Inverter FTXS35 Gas 410
Điều hòa âm trần Daikin 18.000 2 chiều cho chung cư cao cấp
Điều hòa âm trần Panasonic 18.000 1 chiều cho chung cư cao cấp
Thông tin ISYSTEM
.
Sửa điều hòa
.
Hướng dẫn sử dụng điều hòa
.
Điều hòa hai chiều
.
Điều hòa inverter
Điều hòa sản xuất trong nước
.
Điều hòa LG
.
Điều hòa Samsung
.
Điều hòa Midea
.
Điều hòa Nagakawa
.
Điều hòa Carrier
Điều hòa nhập khẩu
.
Điều hòa Daikin
.
Điều hòa Fujitsu
.
Điều hòa Panasonic
.
Điều hòa Toshiba
.
Điều hòa Mitsubishi
Điều hòa bán chạy
.
Điều hòa Panasonic
.
Điều hòa Daikin
.
Điều hòa Samsung
Điều hòa
|
Sửa điều hòa
|
Điều hòa Panasonic
|
Điều hòa Daikin
|
Điều hòa LG
|
May Dieu hoa
© Bản quyền của Trung tâm Phần Phối Sản phẩm Điện Lạnh Hà Nội
Địa chỉ:
19A/2 - 283 Trần Khát Chân (Sau tòa nhà Vietinbank)
Kho hàng: 622 Minh Khai, Hai Bà Trưng, Hà Nội - Khu vực Ba Đình - Từ Liêm - Tây hồ Tòa nhà Viện Triết học - 59 Láng Hạ - Ba Đình - Hà Nội
Tel: 043.5149453 - (Hot line:0938161686 / 0988257667) (Làm việc cả thứ 7 & chủ nhật) Email:info@isystem.com.vn
Điều hòa Samsung | Điều hòa nhiệt độ Samsung | Công nghệ Hàn Quốc


text:
Một trong các khái niệm mới chủ yếu trong XPath 2.0 và XSLT 2.0 là tất cả mọi thứ là một dãy. Trong XPath 1.0 và XSLT 1.0, bạn thường làm việc với cây các nút. Tài liệu XML sau khi phân tích cú pháp là một cây có chứa nút document (tài liệu) và con cháu của nó. Nhờ sử dụng cây các nút, bạn có thể tìm thấy nút cho phần tử root (gốc), cùng với tất cả các con cháu, các thuộc tính, và các anh chị em của phần tử gốc đó. (Bất kỳ các nhận xét hoặc các lệnh xử lý nào bên ngoài phần tử gốc của tệp XML được coi là anh chị em của phần tử gốc này).
Khi bạn làm việc với một tài liệu XML trong XPath 2.0 và XSLT 2.0, bạn sử dụng dãy này theo cùng một cách như cấu trúc cây trong XPath 1.0 và XSLT 1.0. Dãy này chứa một mục duy nhất (nút tài liệu), và bạn sử dụng nó giống như cách bạn vẫn luôn áp dụng. Tuy nhiên, bạn có thể tạo ra các dãy các giá trị nguyên tử. Liệt kê 1, được lấy từ ứng dụng mẫu sắp tới, trong đó bạn sẽ quản lý dữ liệu cho một giải đấu đấu loại trực tiếp gồm 16 đội, cho thấy một ví dụ về một dãy các giá trị nguyên tử.
Liệt kê 1. Một dãy các giá trị nguyên tử
<xsl:variable name="seeds" as="xs:integer*"> <xsl:sequence select="(1, 16, 8, 9, 5, 12, 4, 13, 6, 11, 3, 14, 7, 10, 2, 15)"/> </xsl:variable>
Mã này định nghĩa biến
$seeds. Phần tử mới
<xsl:sequence> định nghĩa một dãy các
mục, như bạn có thể đoán ra. Trong trường hợp này, các mục có các kiểu
xs:integer của Lược đồ XML. Thuộc tính mới as
định nghĩa kiểu dữ liệu của biến, dấu hoa thị
(
xs:integer*) có nghĩa là dãy này chứa từ không
đến nhiều số nguyên. Trong XPath 1.0 và XSLT 1.0, bạn sẽ tạo 16 nút văn
bản khác nhau và sau đó nhóm các nút đó lại thành một biến. Trong XPath
2.0 và XSLT 2.0, dãy hoạt động như là một mảng một chiều của các số, chính
là cái mà bạn muốn cho ứng dụng mẫu.
Các dãy tuân theo một vài quy tắc. Đầu tiên, chúng không thể chứa các dãy
khác. Nếu bạn tạo một dãy mới từ một dãy có ba mục, theo sau là một dãy
khác có ba mục, thì kết quả sẽ là một dãy mới có sáu mục. Thứ hai, các dãy
cho phép bạn pha trộn các nút và các mục. Bạn có thể tạo ra một dãy có
chứa các giá trị nguyên tử được hiển thị trong Liệt kê
1, cộng với tất cả các phần tử
<contestant>, như trong Liệt kê 2.
Liệt kê 2. Một dãy các nút và các giá trị nguyên tử
<xsl:variable name="seeds" as="item()*"> <xsl:for-each select="/bracket/contestants/contestant"> <xsl:copy-of select="."/> </xsl:for-each> <xsl:sequence select="(1, 16, 8, 9, 5, 12, 4, 13, 6, 11, 3, 14, 7, 10, 2, 15)"/> </xsl:variable>
Biến
$seeds chứa tất cả các nút contestant (đội
tham gia thi đấu) và 16 giá trị nguyên tử mà bạn đã dùng trước đó. Lưu ý
rằng kiểu dữ liệu của biến đó là
item()*. Một
item là một nút hoặc một giá trị nguyên tử, do đó, biến này có thể chứa
bất cứ cái gì.
Bây giờ bạn đã biết những điều cơ bản về các dãy và các mục, chúng ta hãy
xem xét toán tử
to, là toán tử mới trong XPath
2.0 và XSLT 2.0. Nó cho phép bạn chọn một loạt các số nguyên. Ví dụ, bạn
có thể tạo một dãy như trong Liệt kê 3.
Liệt kê 3. Một dãy các số nguyên được tạo bằng toán tử
to
<xsl:variable name="range" as="item()*"> <xsl:sequence select="1 to 16"/> </xsl:variable>
Mã này tạo ra một biến có tên là
$range chứa các
số nguyên từ 1 đến 16. Trong ứng dụng mẫu, bạn có thể sử dụng toán tử
to làm một cơ chế vòng lặp, như trong Liệt kê 4.
Liệt kê 4. Sử dụng toán tử
to để tạo vòng lặp
<xsl:for-each select="1 to 32">  </xsl:for-each>
Trước khi bạn xây dựng bản định kiểu, hãy xem xét ứng dụng mẫu chi tiết hơn.
Hiểu ứng dụng mẫu
Trong ứng dụng mẫu cho bài viết này, bạn sẽ quản lý dữ liệu cho một giải đấu đấu loại trực tiếp gồm 16 đội. Như bạn đã mong đợi, dữ liệu giải đấu được thể hiện bằng XML. Bạn sẽ tạo một bản định kiểu XSLT 2.0 để biến đổi dữ liệu XML thành một bảng HTML biểu thị các kết quả của giải đấu. Liệt kê 5 cho thấy định dạng tài liệu XML.
Liệt kê 5. Tài liệu XML có dữ liệu giải đấu
<?xml version="1.0" encoding="UTF-8"?>  <bracket> <title>RSDC Smackdown</title> <contestants> <contestant seed="1" image="images/homerSimpson.png">Donuts</contestant> <contestant seed="2" image="images/caffeine.png">Caffeine</contestant> <contestant seed="3" image="images/fearlessFreep.png">Fearless Freep</contestant> <contestant seed="4" image="images/wmd.jpg">Weapons of Mass Destruction</contestant> <contestant seed="5" image="images/haroldPie.jpg">Pie</contestant> <contestant seed="6" image="images/adamAnt.png">Adam Ant</contestant> <contestant seed="7" image="images/georgeWBush.jpg">Misunderestimated</contestant> <contestant seed="8" image="images/sillyPutty.jpg">Silly Putty</contestant> <contestant seed="9" image="images/krazyGlue.jpg">Krazy Glue</contestant> <contestant seed="10" image="images/snoopDogg.png">Biz-Implification</contestant> <contestant seed="11" image="images/atomAnt.png">Atom Ant</contestant> <contestant seed="12" image="images/ajaxcan.png">AJAX</contestant> <contestant seed="13" image="images/darthVader.jpg">Darth Vader</contestant> <contestant seed="14" image="images/nastyCanasta.png">Nasty Canasta</contestant> <contestant seed="15" image="images/jcp.png">Java Community Process</contestant> <contestant seed="16" image="images/andre.png">Andre the Giant</contestant> </contestants> <results> <result round="1" firstSeed="1" secondSeed="16" winnerSeed="1"/> <result round="1" firstSeed="8" secondSeed="9" winnerSeed="9"/> <result round="1" firstSeed="5" secondSeed="12" winnerSeed="5"/> <result round="1" firstSeed="4" secondSeed="13" winnerSeed="4"/> <result round="1" firstSeed="6" secondSeed="11" winnerSeed="11"/> <result round="1" firstSeed="3" secondSeed="14" winnerSeed="3"/> <result round="1" firstSeed="7" secondSeed="10" winnerSeed="10"/> <result round="1" firstSeed="2" secondSeed="15" winnerSeed="2"/> <result round="2" firstSeed="1" secondSeed="9" winnerSeed="1"/> <result round="2" firstSeed="5" secondSeed="4" winnerSeed="5"/> <result round="2" firstSeed="11" secondSeed="3" winnerSeed="3"/> <result round="2" firstSeed="10" secondSeed="2" winnerSeed="2"/> <result round="3" firstSeed="1" secondSeed="5" winnerSeed="1"/> <result round="3" firstSeed="3" secondSeed="2" winnerSeed="2"/> <result round="4" firstSeed="1" secondSeed="2" winnerSeed="2"/> </results> </bracket>
Trong phần tử
<title>, bạn có thể thấy tên
của giải đấu là RSDC Smackdown. Tài liệu này biểu diễn các kết quả thực tế
từ một phiên họp tại Hội nghị phát triển phần mềm Rational của IBM trong
năm nay.
Một khung bảng chứa 16 phần tử
<contestant> (đội tham gia thi đấu), mỗi
phần tử có tên (văn bản của nó), số hạt giống, và hình ảnh. Một giải đấu
16 đội có 15 cặp đấu. Mỗi cặp đấu được biểu diễn bằng một phần tử
<result>. Bốn dữ liệu gắn với mỗi cặp đấu
là: vòng đấu của trận đấu ấy, (thuộc tính
round), các số hạt giống của hai đội (được lưu
trữ trong các thuộc tính
firstSeed và
secondSeed), và số hạt giống của đội thắng
(thuộc tính
winnerSeed). Nhiệm vụ của bạn là
lấy tài liệu XML này và chuyển đổi nó thành một bảng HTML để minh họa các
kết quả, như hiển thị trong Hình 1.
Hình 1. Các kết quả giải đấu trong một bảng HTML
Bảng này có 32 hàng và 5 cột. Khi sử dụng cách tiếp cận XSLT 1.0, bạn có thể xây dựng mỗi lần một hàng của bảng HTML, như trong Liệt kê 6.
Liệt kê 6. Xây dựng một hàng của bảng HTML mỗi lần

  <xsl:text>[1] </xsl:text> <xsl:value-of select="$contestants[@seed='1']/>
  . . .
Cách này sẽ thực hiện được, nhưng bản định kiểu sẽ rất khó duy trì. Mã cho
mỗi hàng và cột được lặp lại trong suốt bản định kiểu. Vấn đề chính ở đây
là bạn cần 32 hàng trong bảng kết quả đầu ra. Mỗi một trong số 32 hàng
chứa dữ liệu từ một phần tử trong tài liệu XML (hoặc một
<contestant> hay một
<result>). Thật không may, bạn không có
32 phần tử để có thể lặp duyệt qua chúng. Bạn có thể sử dụng
<xsl:for-each
select="contestants/contestant|results/result">,
nhưng các phần tử đó không xuất hiện theo thứ tự mà bạn cần đến chúng
trong bảng. XSLT 1.0 không có nhiều công cụ để giúp bạn làm việc này.
Bạn có thể cấu trúc lại mã để làm cho bản định kiểu đơn giản hơn nhiều. Có các mẫu hình cho kiểu dáng và nội dung của các ô, và bạn có thể sử dụng các tính năng mới của XPath 2.0 và XSLT 2.0 để lặp duyệt qua các mẫu hình đó. Bản định kiểu cuối cùng là nhỏ hơn khoảng 70% so với phiên bản ban đầu (phải thừa nhận là vụng về). Trước khi bạn xây dựng bản định kiểu đó, chúng ta hãy xem xét cách cấu trúc lại mã.
Cấu trúc lại mã - Tính toán các kiểu dáng ô của bảng
Để cấu trúc lại mã, hãy bắt đầu di chuyển thông tin kiểu dáng sang một bản
định kiểu CSS. Như bạn có thể thấy trong Hình 2, bảng
khung HTML có 5 kiểu dáng ô khác nhau:
None,
MatchupStart,
MatchupMiddle,
MatchupEnd, và
Solid.
Hình 2. Các kiểu dáng đường viền ô trong bảng HTML
Liệt kê 7 cho thấy mã CSS trông như thế nào.
Liệt kê 7. Bản định kiểu CSS
.None { width: 20%; } .MatchupStart { width: 20%; border: none; border-top: solid; border-right: solid; } .MatchupMiddle { width: 20%; border: none; border-right: solid; } .MatchupEnd { width: 20%; border: none; border-bottom: solid; border-right: solid; } .Solid { width: 20%; border: solid; }
Các kiểu dáng đường viền làm cho việc xem kết quả của giải đấu thành dễ
dàng. Các đường ngang nối hai ô cho biết rằng hai đối thủ nào đã đối đầu
với nhau; ô có đường viền liền nét trong cột tiếp sau cho thấy người chiến
thắng của cặp đấu này. Nhìn vào các kiểu dáng đường viền, bạn có thể thấy
một mẫu hình xác định: Đối với mỗi cặp đối thủ, các ô trước đối thủ đầu
tiên không có đường viền (kiểu dáng là
None),
các ô dành cho hai đối thủ có đường viền liền nét (kiểu dáng
Solid), các ô giữa hai đối thủ chỉ có đường
viền ở bên phải (kiểu dáng
MatchupMiddle), và
các ô sau đối thủ cuối cùng không có đường viền (kiểu dáng
None). Điều này hơi khác một chút so với cột
đầu tiên. Vì các cặp đối thủ trong cột đầu tiên là quá gần nhau, nên ô
dành cho đối thủ đầu tiên có một đường viền trên đỉnh và bên phải (kiểu
dáng
MatchupStart), và ô dành cho đối thủ thứ
hai có một đường viền dưới đáy và bên phải (kiểu dáng
MatchupEnd).
Lưu ý rằng các cặp đối thủ cách nhau xa hơn trong mỗi cột. Khoảng cách một ô giữa các đối thủ cột 1, khoảng cách ba ô ở cột 2, khoảng cách bảy ô ở cột 3, và khoảng cách 15 ô ở cột 4. Kích thước của mỗi khoảng cách bằng một lũy thừa hai trừ một, do đó, có một mẫu hình xác định ở đây.
Mẫu hình tổng quát xuyên suốt bảng này là mỗi cột có chứa một nhóm các ô lặp lại. Kích thước của các nhóm lặp lại (mà tôi sẽ gọi là chu kỳ của cột, vì thiếu một thuật ngữ hay hơn) là 4, 8, 16, 32 và 64 trong năm cột. Mỗi nhóm lặp lại có hai đối thủ, các ô giữa hai đối thủ và các ô trước và sau hai đối thủ.
Trong mỗi cột, hãy sử dụng hai giá trị trong tính toán của bạn:
$period, là kích thước của nhóm lặp lại, và
$oneQuarter, bằng 1/4 kích thước của chu kỳ.
(Việc lưu
$period div 4 vào một biến làm cho mã
sạch hơn). Bảng 1 cho thấy các quy tắc tổng quát hóa
cho các kiểu dáng đường viền của ô.
Bảng 1. Các kiểu dáng đường viền của ô trong bảng HTML
Bây giờ bạn đã có một công thức đẹp đẽ để tìm ra kiểu dáng của bất kỳ ô cụ thể nào trong bảng. Cho trước số cột và số hàng, công thức làm việc như một phép màu.
Cấu trúc lại mã - Tính toán nội dung ô trong bảng
Khi bạn tạo ra một ô trong bảng, tất nhiên, bạn cũng cần phải đưa nội dung
thích hợp vào trong ô đó. Việc này cũng có một mẫu hình thú vị. Bất cứ ô
nào có kiểu dáng là
None hoặc
MatchupMiddle đều không có bất kỳ nội dung nào.
Điều đó có nghĩa là bạn chỉ phải lo nghĩ về việc tìm kiếm các nội dung phù
hợp cho các ô có ba kiểu dáng khác còn lại.
Trong Bảng 1, bạn có thể thấy rằng các ô có nội dung
có thuộc tính
$row =
$oneQuarter hoặc $row = $period - $oneQuarter.
Với cột đầu tiên, bạn chỉ cần viết số hạt giống và tên của đội thi đấu
thích hợp. Các cặp đấu đều dựa vào các cách chọn hạt giống và mô tả các
cặp đấu được thể hiện trong Bảng 2.
Bảng 2. Các cặp đấu dựa vào cách chọn hạt giống
Các cặp đấu được bố trí sao cho nếu hạt giống xếp cao hơn luôn thắng, thì
đội xếp hạt giống cao nhất sẽ luôn đấu với đội xếp hạt giống thấp nhất còn
lại, đội xếp hạt giống thứ hai sẽ luôn đấu với đội xếp thứ hai từ dưới lên
còn lại, và v.v.. Nhìn vào các hạt giống theo thứ tự này (1, 16, 8, 9, 5,
12, 4, 13, 6, 11, 3, 14, 7, 10, 2, 15), bạn có thể thấy chúng phù hợp với
các giá trị trong
$seeds. Các đối thủ được hiển
thị trong cột 1 theo thứ tự này.
Đối thủ xuất hiện trong tất cả các hàng khác, có nghĩa là hàng 1 có hạt
giống đầu tiên trong dãy, hàng 3 có hạt giống thứ hai trong dãy, hàng 5
hạt giống thứ ba trong dãy, và v.v.. Ở đây mẫu hình là
$row + 1 div 2 =
$index. Nói cách
khác, lấy số hàng, cộng 1, và chia cho 2 để nhận được chỉ số của hạt giống
trong dãy
$seeds. Nội dung ô của bảng là số hạt
giống tiếp theo là tên của đối thủ có số hạt giống đó.
Mẫu hình trên bảo đảm nội dung cho cột 1. Với các cột từ 2 đến 5, như bạn
có thể dự kiến, sẽ phức tạp hơn. Thay vì xem xét các phần tử
<contestant>, bạn cần phải xem xét các
kết quả được hiển thị trong 15 phần tử
<result>.
Cột 2 chứa những đội thắng ở vòng 1. Điều đó có nghĩa là bạn cần phải xem
xét các phần tử
<result> có thuộc tính
round="1". Để giữ cho mọi thứ đơn giản hơn, đội
thắng của cặp đấu đầu tiên (hạt giống 1 đấu với 16) được lưu trữ trong
phần tử
<result> đầu tiên, đội thắng của
cặp đấu thứ hai (hạt giống 8 đấu với 9) được lưu trữ trong phần tử
<result> thứ hai , và v.v.. Những đội
thắng trong cột 2 được hiển thị trong các hàng 2, 6, 10, 14, 18, 22, 26,
và 30. Hãy tìm kiếm một mẫu hình, hàng 2 sử dụng phần tử
<result> đầu tiên, hàng 6 sử dụng phần tử
<result> thứ hai, và hàng 10 sử dụng phần tử <result> thứ ba. Với
cột này, nếu bạn lấy số hàng, cộng 2, và chia cho 4, bạn sẽ nhận được vị
trí của phần tử
<result round="1"> phù
hợp.
Cột 3 và 4 được xử lý tương tự. Những đội thắng trong cột 3 được hiển thị
trong các hàng 4, 12, 20, và 28 (mẫu hình ở đây là cộng 4 và chia cho 8).
Những đội thắng trong cột 4 được hiển thị trong hàng 8 và 24 (cộng 8 và
chia cho 16). Cột 5 hiển thị một đội duy nhất — đội thắng
của toàn bộ giải đấu. Nếu bạn đang ở hàng 16, bạn sẽ hiển thị đội thắng từ
phần tử
<result round="4">.
Cách cấu trúc lại để tìm vị trí của giá trị mà bạn tìm kiếm là
($row + $oneQuarter)
div ($oneQuarter * 2).
Việc tăng dần kích thước của mẫu hình lặp lại làm cho mã đơn giản. Với cột
1, vị trí tính được là chỉ số trong dãy các hạt giống; với các cột khác,
vị trí tính được là vị trí của phần tử
<result>.
Bây giờ bạn có một công thức đẹp đẽ để xác định cả nội dung lẫn kiểu dáng của mỗi ô trong bảng. Dựa vào số hàng và cột, bạn có thể tìm ra tất cả mọi thứ bạn cần biết.
Khai thác sức mạnh của XPath 2.0 và XSLT 2.0
Bây giờ bạn có thể sử dụng các kỹ thuật mới trong XPath 2.0 và XSLT 2.0 để
trau chuốt bản định kiểu. Để bắt đầu, hãy sử dụng toán tử
to. Nếu bạn dựng bảng bằng một ngôn ngữ lập
trình thủ tục, bạn có thể làm điều gì đó tương tự như Liệt kê 8.
Liệt kê 8. Cách tiếp cận thủ tục cho bảng định kiểu
for (int row=1; row<=32; row++) for (int column=1; column<=5; column++) // Build each cell in the table here
Với XPath 2.0 và XSLT 2.0, bạn sử dụng
<xsl:for-each> để thay thế các vòng lặp
for mà bạn sử dụng trong một ngôn ngữ thủ tục.
Liệt kê 9 cho bạn biết cách làm như thế
nào.
Liệt kê 9. Thực hiện vòng lặp
for với toán tử
to
<xsl:for-each select="1 to 32"> <xsl:variable name="outerIndex" select="."/>
 <xsl:for-each select="1 to 5">
Bạn cần phải giải quyết một vài tình tiết phức tạp ở đây. Đầu tiên, trong
XPath 1.0 và XSLT 1.0, việc sử dụng
<xsl:for-each> đã làm thay đổi ngữ cảnh
cho mỗi lần lặp. Ví dụ, nếu bạn sử dụng
<xsl:for-each
select="contestants/contestant>,
thì nút ngữ cảnh là
<contestant> mới nhất
trong mỗi lần lặp. Khi bạn sử dụng toán tử
to
để lặp duyệt qua các số nguyên khác nhau, mục ngữ cảnh (đó là ngữ cảnh
item trong 2.0) là không xác định. Như bạn có thể thấy
trong Liệt kê 9, bạn cần phải ghi lưu giá trị hiện
tại của
<xsl:for-each> bên ngoài bởi vì
nó không có sẵn cho bạn ở
<xsl:for-each>
bên trong.
Nhưng còn tệ hơn nữa. Nếu mục ngữ cảnh là không xác định, bạn không có
cách nào để chọn các nút từ tài liệu. Nếu bạn biết bạn đang ở hàng
1, cột 1, bạn có thể nhận được mục đầu tiên từ dãy
$seeds vì
$seeds là
một biến chung. Điều đó nói cho bạn biết rằng bạn cần phải tìm phần tử
<contestant
seed="1">. Thật
không may, bạn không thể nhận được bất cứ điều gì trong tài liệu. Ngay cả
việc sử dụng một biểu thức XPath tuyệt đối như là
/bracket/contestants/contestant[@seed='1'] cũng
không thành công. Vì lý do đó, bạn cần lưu trữ các nút mà bạn quan tâm làm
các một biến chung. Liệt kê 10 cho bạn thấy cách
truy cập các một biến chung, bất cứ khi nào và ở bất cứ nơi nào bạn
cần.
Liệt kê 10. Một biến chung lưu trữ các nút bạn cần
<xsl:variable name="results" select="/bracket/results"/> <xsl:variable name="contestants" select="/bracket/contestants"/>
Nếu bạn cần lấy tên của đội đấu hạt giống 16 , biểu thức XPath là
$contestants/contestant[@seed="16"]. Bạn truy
cập phần tử
<result> tương tự; nếu bạn
cần nhận được đội thắng trong cặp đấu thứ hai trong vòng 2, biểu thức là
$results/result[@round="2"][2]/@winnerSeed. Liệt kê 11 cho thấy hai một biến chung nữa mà
bạn có thể sử dụng để tạo ra bảng HTML.
Liệt kê 11. Các một biến chung có ích khác
<xsl:variable name="periods" as="xs:integer*"> <xsl:sequence select="(4, 8, 16, 32, 64)"/> </xsl:variable> <xsl:variable name="backgroundColors" as="xs:string*"> <xsl:sequence select="('background: #CCCCCC;', 'background: #9999CC;', 'background: #99CCCC;', 'background: #CC99CC;', 'background: #CCCC99;')"/> </xsl:variable>
Các biến này lưu trữ giá trị của chu kỳ cho mỗi cột và màu nền cho mỗi cột. Để sử dụng từng biến, bạn chỉ cần sử dụng số cột làm chỉ số của giá trị duy nhất mà bạn muốn.
Một cải tiến thú vị trong XPath 2.0 và XSLT 2.0 là phần tử
<xsl:function>. Hãy tạo hai hàm trong bản
định kiểu là:
cellStyle và
getResults. Hàm đầu tiên trả về kiểu dáng đường
viền cho mỗi ô, trong khi hàm thứ hai trả về kết quả (nếu có) cho một cặp
đấu. Các tham số cho cả hai hàm là số hàng và cột của ô. Liệt kê 12 trình bày mã cho hàm
cellStyle.
Liệt kê 12. Hàm
cellStyle
<xsl:function name="bracket:cellStyle" as="xs:string"> <xsl:param name="row" as="xs:integer"/> <xsl:param name="column" as="xs:integer"/> <xsl:variable name="period" as="xs:integer" select="subsequence($periods, $column, 1)"/> <xsl:variable name="oneQuarter" as="xs:integer" select="$period div 4"/> <xsl:variable name="lastColumn" as="xs:boolean" select="$oneQuarter = count($contestants/contestant)"/> <xsl:variable name="position" select="$row mod $period"/> <xsl:value-of select="if ($position = $oneQuarter) then (if ($column = 1) then 'MatchupStart' else 'Solid') else if ($position = $period - $oneQuarter) then (if ($column = 1) then 'MatchupEnd' else 'Solid') else if ($lastColumn) then 'None' else if ($position < $oneQuarter or $position > $period - $oneQuarter) then 'None' else 'MatchupMiddle'"/> </xsl:function>
Trước khi bạn xác định kiểu dáng ô, bạn sử dụng 4 biến. Bạn lấy ra giá trị
$period từ một biến chung
$periods. Như tôi đã đề cập ở trên,
$oneQuarter đơn giản là
$period div
4. Biến
$lastColumn kiểu boolean là kết quả so sánh
$oneQuarter với tổng số đội trong giải đấu. Nếu
các giá trị đó bằng nhau, bạn đang xử lý cột cuối cùng. Cuối cùng, biến
$position cho biết vị trí của hàng hiện tại
trong mẫu hình. Nói cách khác, hàng 9 trong bảng là hàng đầu tiên của nhóm
lặp lại cho các cột 1 và 2. Hãy sử dụng vị trí của hàng trong mẫu hình để
tìm ra kiểu dáng của ô.
XPath 2.0 và XSLT 2.0 có một toán tử
if, gồm một
biểu thức (trong ngoặc), tiếp sau là mệnh đề
then và mệnh đề
else. Toàn bộ các thành phần này nằm trong
thuộc tính
select của
<xsl:value-of>. Trong ví dụ này, bạn thay
thế phần tử
<xsl:choose> dài dòng hơn
nhiều bằng chỉ một biểu thức. Mã ở đây là khá đơn giản, dựa vào cuộc thảo
luận về các công thức bảng; nếu logic phức tạp hơn, thì có lẽ sử dụng
<xsl:choose>, sẽ dễ bảo trì hơn, mặc dù
nó đòi hỏi phải gõ bàn phím nhiều hơn.
Một số lưu ý về cú pháp cho hàm
<xsl:function>: Đầu tiên, bạn cần phải
khai báo một vùng tên mới cho các hàm này. Nếu bạn gọi
bracket:cellStyle() trong một biểu thức XPath,
vùng tên này sẽ cho bộ xử lý XSLT 2.0 biết cách tìm hàm này. Thứ hai, lưu
ý rằng bạn đã sử dụng thuộc tính
as="xs:string"
để chỉ ra rằng hàm này trả về một chuỗi. Phần tử
<xsl:value-of> trả về một trong năm tên
kiểu dáng, đó là đầu ra của hàm.
Hàm
getResults có phức tạp hơn một chút, nhưng
không nhiều, bạn có thể thấy trong Liệt kê
13.
Liệt kê 13. Hàm
getResults
<xsl:function name="bracket:getResults" as="xs:string"> <xsl:param name="row" as="xs:integer"/> <xsl:param name="column" as="xs:integer"/> <xsl:variable name="period" as="xs:integer" select="subsequence($periods, $column, 1)"/> <xsl:variable name="oneQuarter" as="xs:integer" select="$period div 4"/> <xsl:variable name="position" select="$row mod $period"/> <xsl:choose> <xsl:when test="$position = $oneQuarter or $position = $period - $oneQuarter"> <xsl:variable name="round" select="$column - 1"/> <xsl:variable name="index" select="($row + $oneQuarter) div ($oneQuarter * 2)"/> <xsl:variable name="currentSeed" select="if ($column = 1) then subsequence($seeds, $index, 1) else $results/result[@round=$round][$index]/@winnerSeed"/> <xsl:choose> <xsl:when test="string-length(string($currentSeed))"> <xsl:value-of select="concat('[', $currentSeed, '] ', $contestants/contestant[@seed=$currentSeed])"/> </xsl:when> <xsl:otherwise> <xsl:text> </xsl:text> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:text> </xsl:text> </xsl:otherwise> </xsl:choose> </xsl:function>
Bạn có các tham số tương tự như trước đây. Bạn phải làm một số việc xử lý
đặc biệt ở đây cho cột 1, có chứa dữ liệu từ các phần tử
<contestant>, trong khi các cột khác chứa
dữ liệu từ các phần tử
<result>. Cũng
giống như với hàm
cellStyle bạn tính toán
$period và
$position, và bạn sử dụng biến
$oneQuarter để đơn giản hóa các công thức.
Nếu ô chứa một đội thi đấu, bạn tính toán thêm ba biến. Biến
$round là số cột trừ đi một (cột 2 chứa kết quả
của vòng 1), và bạn tính toán biến
$index theo
công thức thảo luận ở trên.
Bạn cần phải làm theo hai bước để tìm dữ liệu thích hợp. Đầu tiên, thiết
lập giá trị của biến
$currentSeed. Nếu đây là
vòng 1, bạn sử dụng hàm
subsequence mới để chọn
một giá trị từ biến
$seeds. Đối với các vòng
khác, bạn lấy thuộc tính
winnerSeed từ phần tử
<result> thích hợp.
Thứ hai, ngoài việc xử lý cột 1 khác đi, bạn cần tính đến khả năng có một
phần tử
<result> không có đội thắng
(
winnerSeed=""). Nếu điều đó xảy ra, hãy trả về
một khoảng trống cứng (
 ). Theo cách
XSLT 2.0 xử lý các kiểu dữ liệu (đây là một chủ đề cho một bài viết sắp
tới), bạn cần phải chuyển đổi
$currentSeed
thành một chuỗi, rồi kiểm tra độ dài của chuỗi. Nếu chiều dài của chuỗi
bằng không, hãy trả về một khoảng trống cứng; ngược lại, hãy trả về hạt
giống và tên của đội thi đấu.
Cuối cùng, lưu ý rằng bạn sử dụng hàm
<xsl:choose> ở đây. Mặc dù bạn có thể làm
mọi thứ với chỉ một câu lệnh
if của XPath, mã
sẽ rất cồng kềnh. Mặc dù hàm
<xsl:choose>
dài dòng hơn, mã sạch hơn và dễ hiểu hơn.
Bây giờ khi bạn đã thiết lập các một biến chung và các hàm mà bạn cần, trọng tâm của bản kiểu định kiểu là đơn giản và đẹp đẽ, bạn có thể thấy trong Liệt kê 14.
Liệt kê 14. Trọng tâm của bản định kiểu
<xsl:for-each select="1 to 32"> <xsl:variable name="outerIndex" select="."/>
 <xsl:for-each select="1 to 5">  <xsl:value-of select="bracket:getResults($outerIndex, .)"/> 	 </xsl:for-each>
 </xsl:for-each>
Bạn có hai vòng lặp tạo ra 5 cột với 32 hàng của bảng. Đối với mỗi ô, màu
nền được dựa vào số cột hiện tại. Hàm
cellStyle
xác định kiểu dáng đường viền (
class="x"), và
hàm
getResults xác định giá trị của ô.
Sử dụng bản định kiểu
Như bạn đã có thể dự kiến, cần một trình xử lý XSLT 2.0 để sử dụng bản định
kiểu này. Tôi sẽ không in lại toàn bộ bản định kiểu ở đây, nhưng bạn phải
sử dụng
<xsl:stylesheet version="2.0"> để
cho trình xử lý sẽ chạy ở chế độ XSLT 2.0. Tôi rất khuyến cáo nên dùng
trình xử lý Saxon của Michael Kay (xem phần Tài
nguyên để biết thêm chi tiết). Tiến sĩ Kay vốn là người soạn thảo
đặc tả XSLT 2.0, và Saxon, theo một vài phương diện, đã là một ca kiểm thử
khi đặc tả này đang được phát triển. Nếu bạn sử dụng Saxon, hãy dùng lệnh
dưới đây để biến đổi tệp XML
tourney.xml bằng
cách sử dụng bản định kiểu
results-html.xsl và
viết đầu ra cho tệp
results.html:
java net.sf.saxon.Transform -o results.html tourney.xml
results-html.xsl
Để minh họa cho tính linh hoạt của bản định kiểu này, hãy lấy ra một vài
kết quả trong tệp XML và chạy phép biến đổi này. Liệt
kê 15 cho thấy phần tử
<result>
trông như thế nào.
Liệt kê 15. Tài liệu XML với dữ liệu giải đấu chưa hoàn thành
<?xml version="1.0" encoding="UTF-8"?>  <bracket> . . . <results> <result round="1" firstSeed="1" secondSeed="16" winnerSeed="1"/> <result round="1" firstSeed="8" secondSeed="9" winnerSeed="9"/> <result round="1" firstSeed="5" secondSeed="12" winnerSeed="5"/> <result round="1" firstSeed="4" secondSeed="13" winnerSeed="4"/> <result round="1" firstSeed="6" secondSeed="11" winnerSeed="11"/> <result round="1" firstSeed="3" secondSeed="14" winnerSeed="3"/> <result round="1" firstSeed="7" secondSeed="10" winnerSeed="10"/> <result round="1" firstSeed="2" secondSeed="15" winnerSeed="2"/> <result round="2" firstSeed="" secondSeed="" winnerSeed=""/> <result round="2" firstSeed="" secondSeed="" winnerSeed=""/> <result round="2" firstSeed="" secondSeed="" winnerSeed=""/> <result round="2" firstSeed="" secondSeed="" winnerSeed=""/> <result round="3" firstSeed="" secondSeed="" winnerSeed=""/> <result round="3" firstSeed="" secondSeed="" winnerSeed=""/> <result round="4" firstSeed="" secondSeed="" winnerSeed=""/> </results> </bracket>
Liệt kê 15 biểu diễn trạng thái của giải đấu sau
vòng đầu tiên. Tất cả các phần tử
<result> cho vòng 2, 3, và 4 có một thuộc
tính trống
winnerSeed. Mặc dù vậy, bản định
kiểu tạo ra khung bảng chính xác, bạn có thể thấy trong Hình 3.
Hình 3. Khung bảng cho một giải đấu chưa hoàn thành
Tóm tắt
Bài viết này đã trình diễn nhiều tính năng mới của XPath 2.0 và XSLT 2.0.
Trong ứng dụng mẫu, bạn đã chọn một bản định kiểu cồng kềnh và đã cấu trúc
lại nó thành một đoạn mã nhỏ hơn nhiều và dễ bào trì hơn. Một phần nỗ lực
của bạn là để phân tích mã nhằm tìm ra các mẫu hình, nhưng nếu không có
toán tử
to, hàm
<xsl:function>, và dãy các mục, thì việc
sắp xếp hợp lý bảng định kiểu nhiều như bạn đã làm sẽ rất khó khăn.
Đáng kể nhất, bạn đã tạo ra các hàm chung có thể xử lý bất kỳ số lượng đối
thủ nào. Ví dụ, để thay đổi bản định kiểu nhằm xử lý một giải đấu có 32
đội, bạn cần phải thay đổi các dãy
$seeds và
$periods. Bạn cũng cần thay thế
select="1 to
5" bằng
select="1 to $rounds", ở đây
$rounds là số vòng thi đấu trong giải đấu. Tất
nhiên, giải pháp đẹp đẽ nhất là tạo ra hàm XSLT 2.0 tính toán các giá trị
cho bất kỳ khung bảng chung nào, bao gồm cả số vòng đấu, dãy các hạt giống
(một khung bảng 32-đội mô tả các cặp đấu giữa 1 và 32, 2 và 31, và v.v..),
và các chu kỳ cho các cột khác nhau. Thách thức này được để dành làm một
bài tập cho người đọc.
Cốt lõi của vấn đề là bạn cần lặp duyệt qua 32 hàng của bảng, nhưng XSLT 1.0 không cung cấp cho bạn cách nào thiết thực nào để làm điều đó. Các tính năng mới của XPath 2.0 và XSLT 2.0 giúp bạn giải quyết vấn đề này.
Tải về
Tài nguyên
Học tập
- XSLT là loại ngôn ngữ gì? (Michael Kay, developerWorks, 04. 2005): Hãy đặt ngôn ngữ XSLT trong bối cảnh với bài viết này về triết lý thiết kế đằng sau nó, nó xuất phát từ đâu, nó dùng để làm gì, và tại sao lại sử dụng nó.
- Kế hoạch nâng cấp XSLT 1.0 lên 2.0 (David Marston, Joanne Tong, và Henry Zongaro; developerWorks) Trong loạt bài này, hãy tìm hiểu cách di chuyển các bản định kiểu của bạn từ XSLT 1.0 lên tiêu chuẩn mới.
- Trang Họ ngôn ngữ bản định kiểu mở rộng: Tìm tất cả các khuyến nghị mới cho XSLT 2.0, XPath 2.0, XQuery 1.0, và các đặc tả khác đã trở thành khuyến nghị chính thức của W3C (World Wide Web Consortium) vào ngày 23.01.2007. Toàn bộ định nghĩa ngôn ngữ bao gồm một số đặc tả.
- Chứng chỉ XML của IBM: Tìm hiểu cách bạn có thể trở thành một nhà phát triển có chứng chỉ của IBM về XML và các công nghệ liên quan.
- Thư viện kỹ thuật XML: Xem Vùng XML của developerWorks để thấy một vùng rộng lớn các bài viết kỹ thuật và các lời khuyên, các hướng dẫn, các tiêu chuẩn, và các sách Đỏ của IBM.
- Các sự kiện kỹ thuật và Webcast của developerWorks: Theo sát với công nghệ trong các phiên này.
- Kho sách kỹ thuật: Duyệt qua các sách về chủ đề này và các chủ đề khác.
Lấy sản phẩm và công nghệ
- Trình xử lý Saxon XSLT 2.0: Tìm trình xử lý của Michael Kay trên SourceForge.
- Trang XML của Altovatrên trang web Altova: Nhận thông tin và dùng thử trình xử lý Altova XSLT. Altova, nhà sản xuất XMLSpy và các sản phẩm phổ biến khác, cung cấp bộ xử lý XSLT của mình có sẵn miễn phí. Nó hỗ trợ XSLT 1.0, XSLT 2.0, và XQuery 1.0. Mặc dù nó không phải mã nguồn mở, nhưng giấy phép của nó cho phép bạn nhúng máy XSLT vào trong các sản phẩm của bạn.
- Phần mềm dùng thử IBM: Xây dựng dự án phát triển tiếp theo của bạn với phần mềm dùng thử có sẵn để tải trực tiếp từ developerWorks.
Thảo luận
- Các diễn đàn thảo luận lĩnh vực XML: Tham gia vào bất kỳ các cuộc thảo luận nào liên quan đến XML.
- Các blog developerWorks: Đọc các blog này và dành thời gian cho cộng đồng developerWorks.
Bình luận
-
Vùng dữ liệu trên developerWorks
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
-
Vùng mã nguồn mở trên developerWorks
Xem các bài viết về HTML, CSS, JavaScript,...
-
Điện toán đám mây
Tìm hiểu về điện toán đám mây

markdown:
Một trong các khái niệm mới chủ yếu trong XPath 2.0 và XSLT 2.0 là tất cả mọi thứ là một dãy. Trong XPath 1.0 và XSLT 1.0, bạn thường làm việc với cây các nút. Tài liệu XML sau khi phân tích cú pháp là một cây có chứa nút document (tài liệu) và con cháu của nó. Nhờ sử dụng cây các nút, bạn có thể tìm thấy nút cho phần tử root (gốc), cùng với tất cả các con cháu, các thuộc tính, và các anh chị em của phần tử gốc đó. (Bất kỳ các nhận xét hoặc các lệnh xử lý nào bên ngoài phần tử gốc của tệp XML được coi là anh chị em của phần tử gốc này).
Khi bạn làm việc với một tài liệu XML trong XPath 2.0 và XSLT 2.0, bạn sử
dụng dãy này theo cùng một cách như cấu trúc cây trong XPath 1.0 và XSLT
1.0. Dãy này chứa một mục duy nhất (nút tài liệu), và bạn sử dụng nó giống
như cách bạn vẫn luôn áp dụng. Tuy nhiên, bạn có thể tạo ra các dãy
*các
giá trị nguyên tử*. [Liệt kê 1](#listing1), được lấy từ
ứng dụng mẫu sắp tới, trong đó bạn sẽ quản lý dữ liệu cho một giải đấu đấu
loại trực tiếp gồm 16 đội, cho thấy một ví dụ về một dãy các giá trị
nguyên tử.
##### Liệt kê 1. Một dãy các giá trị nguyên tử
<xsl:variable name="seeds" as="xs:integer*"> <xsl:sequence select="(1, 16, 8, 9, 5, 12, 4, 13, 6, 11, 3, 14, 7, 10, 2, 15)"/> </xsl:variable>
Mã này định nghĩa biến
$seeds. Phần tử mới
<xsl:sequence> định nghĩa một dãy các
mục, như bạn có thể đoán ra. Trong trường hợp này, các mục có các kiểu
xs:integer của Lược đồ XML. Thuộc tính mới as
định nghĩa kiểu dữ liệu của biến, dấu hoa thị
(
xs:integer*) có nghĩa là dãy này chứa từ không
đến nhiều số nguyên. Trong XPath 1.0 và XSLT 1.0, bạn sẽ tạo 16 nút văn
bản khác nhau và sau đó nhóm các nút đó lại thành một biến. Trong XPath
2.0 và XSLT 2.0, dãy hoạt động như là một mảng một chiều của các số, chính
là cái mà bạn muốn cho ứng dụng mẫu.
Các dãy tuân theo một vài quy tắc. Đầu tiên, chúng không thể chứa các dãy
khác. Nếu bạn tạo một dãy mới từ một dãy có ba mục, theo sau là một dãy
khác có ba mục, thì kết quả sẽ là một dãy mới có sáu mục. Thứ hai, các dãy
cho phép bạn pha trộn các nút và các mục. Bạn có thể tạo ra một dãy có
chứa các giá trị nguyên tử được hiển thị trong
[Liệt kê
1](#listing1), cộng với tất cả các phần tử
<contestant>, như trong
[Liệt kê 2](#listing2).
##### Liệt kê 2. Một dãy các nút và các giá trị nguyên tử
<xsl:variable name="seeds" as="item()*"> <xsl:for-each select="/bracket/contestants/contestant"> <xsl:copy-of select="."/> </xsl:for-each> <xsl:sequence select="(1, 16, 8, 9, 5, 12, 4, 13, 6, 11, 3, 14, 7, 10, 2, 15)"/> </xsl:variable>
Biến
$seeds chứa tất cả các nút contestant (đội
tham gia thi đấu) và 16 giá trị nguyên tử mà bạn đã dùng trước đó. Lưu ý
rằng kiểu dữ liệu của biến đó là
item()*. Một
item là một nút hoặc một giá trị nguyên tử, do đó, biến này có thể chứa
bất cứ cái gì.
Bây giờ bạn đã biết những điều cơ bản về các dãy và các mục, chúng ta hãy
xem xét toán tử
to, là toán tử mới trong XPath
2.0 và XSLT 2.0. Nó cho phép bạn chọn một loạt các số nguyên. Ví dụ, bạn
có thể tạo một dãy như trong
[Liệt kê 3](#listing3).
##### Liệt kê 3. Một dãy các số nguyên được tạo bằng toán tử
to
<xsl:variable name="range" as="item()*"> <xsl:sequence select="1 to 16"/> </xsl:variable>
Mã này tạo ra một biến có tên là
$range chứa các
số nguyên từ 1 đến 16. Trong ứng dụng mẫu, bạn có thể sử dụng toán tử
to làm một cơ chế vòng lặp, như trong
[Liệt kê 4](#listing4).
##### Liệt kê 4. Sử dụng toán tử
to để tạo vòng lặp
<xsl:for-each select="1 to 32">  </xsl:for-each>
Trước khi bạn xây dựng bản định kiểu, hãy xem xét ứng dụng mẫu chi tiết hơn.
## Hiểu ứng dụng mẫu
Trong ứng dụng mẫu cho bài viết này, bạn sẽ quản lý dữ liệu cho một giải
đấu đấu loại trực tiếp gồm 16 đội. Như bạn đã mong đợi, dữ liệu giải đấu
được thể hiện bằng XML. Bạn sẽ tạo một bản định kiểu XSLT 2.0 để biến đổi
dữ liệu XML thành một bảng HTML biểu thị các kết quả của giải đấu.
[Liệt kê 5](#listing5) cho thấy định dạng tài liệu XML.
##### Liệt kê 5. Tài liệu XML có dữ liệu giải đấu
<?xml version="1.0" encoding="UTF-8"?>
<bracket> <title>RSDC Smackdown</title> <contestants> <contestant seed="1" image="images/homerSimpson.png">Donuts</contestant> <contestant seed="2" image="images/caffeine.png">Caffeine</contestant> <contestant seed="3" image="images/fearlessFreep.png">Fearless Freep</contestant> <contestant seed="4" image="images/wmd.jpg">Weapons of Mass Destruction</contestant> <contestant seed="5" image="images/haroldPie.jpg">Pie</contestant> <contestant seed="6" image="images/adamAnt.png">Adam Ant</contestant> <contestant seed="7" image="images/georgeWBush.jpg">Misunderestimated</contestant> <contestant seed="8" image="images/sillyPutty.jpg">Silly Putty</contestant> <contestant seed="9" image="images/krazyGlue.jpg">Krazy Glue</contestant> <contestant seed="10" image="images/snoopDogg.png">Biz-Implification</contestant> <contestant seed="11" image="images/atomAnt.png">Atom Ant</contestant> <contestant seed="12" image="images/ajaxcan.png">AJAX</contestant> <contestant seed="13" image="images/darthVader.jpg">Darth Vader</contestant> <contestant seed="14" image="images/nastyCanasta.png">Nasty Canasta</contestant> <contestant seed="15" image="images/jcp.png">Java Community Process</contestant> <contestant seed="16" image="images/andre.png">Andre the Giant</contestant> </contestants> <results> <result round="1" firstSeed="1" secondSeed="16" winnerSeed="1"/> <result round="1" firstSeed="8" secondSeed="9" winnerSeed="9"/> <result round="1" firstSeed="5" secondSeed="12" winnerSeed="5"/> <result round="1" firstSeed="4" secondSeed="13" winnerSeed="4"/> <result round="1" firstSeed="6" secondSeed="11" winnerSeed="11"/> <result round="1" firstSeed="3" secondSeed="14" winnerSeed="3"/> <result round="1" firstSeed="7" secondSeed="10" winnerSeed="10"/> <result round="1" firstSeed="2" secondSeed="15" winnerSeed="2"/> <result round="2" firstSeed="1" secondSeed="9" winnerSeed="1"/> <result round="2" firstSeed="5" secondSeed="4" winnerSeed="5"/> <result round="2" firstSeed="11" secondSeed="3" winnerSeed="3"/> <result round="2" firstSeed="10" secondSeed="2" winnerSeed="2"/> <result round="3" firstSeed="1" secondSeed="5" winnerSeed="1"/> <result round="3" firstSeed="3" secondSeed="2" winnerSeed="2"/> <result round="4" firstSeed="1" secondSeed="2" winnerSeed="2"/> </results> </bracket>
Trong phần tử
<title>, bạn có thể thấy tên
của giải đấu là RSDC Smackdown. Tài liệu này biểu diễn các kết quả thực tế
từ một phiên họp tại Hội nghị phát triển phần mềm Rational của IBM trong
năm nay.
Một khung bảng chứa 16 phần tử
<contestant> (đội tham gia thi đấu), mỗi
phần tử có tên (văn bản của nó), số hạt giống, và hình ảnh. Một giải đấu
16 đội có 15 cặp đấu. Mỗi cặp đấu được biểu diễn bằng một phần tử
<result>. Bốn dữ liệu gắn với mỗi cặp đấu
là: vòng đấu của trận đấu ấy, (thuộc tính
round), các số hạt giống của hai đội (được lưu
trữ trong các thuộc tính
firstSeed và
secondSeed), và số hạt giống của đội thắng
(thuộc tính
winnerSeed). Nhiệm vụ của bạn là
lấy tài liệu XML này và chuyển đổi nó thành một bảng HTML để minh họa các
kết quả, như hiển thị trong
[Hình 1](#fig1).
##### Hình 1. Các kết quả giải đấu trong một bảng HTML
![ Các kết quả giải đấu trong một bảng HTML](results.gif)
Bảng này có 32 hàng và 5 cột. Khi sử dụng cách tiếp cận XSLT 1.0, bạn có
thể xây dựng mỗi lần một hàng của bảng HTML, như trong
[Liệt kê 6](#listing6).
##### Liệt kê 6. Xây dựng một hàng của bảng HTML mỗi lần

  <xsl:text>[1] </xsl:text> <xsl:value-of select="$contestants[@seed='1']/>
  . . .
Cách này sẽ thực hiện được, nhưng bản định kiểu sẽ rất khó duy trì. Mã cho
mỗi hàng và cột được lặp lại trong suốt bản định kiểu. Vấn đề chính ở đây
là bạn cần 32 hàng trong bảng kết quả đầu ra. Mỗi một trong số 32 hàng
chứa dữ liệu từ một phần tử trong tài liệu XML (hoặc một
<contestant> hay một
<result>). Thật không may, bạn không có
32 phần tử để có thể lặp duyệt qua chúng. Bạn có thể sử dụng
<xsl:for-each
select="contestants/contestant|results/result">,
nhưng các phần tử đó không xuất hiện theo thứ tự mà bạn cần đến chúng
trong bảng. XSLT 1.0 không có nhiều công cụ để giúp bạn làm việc này.
Bạn có thể cấu trúc lại mã để làm cho bản định kiểu đơn giản hơn nhiều. Có các mẫu hình cho kiểu dáng và nội dung của các ô, và bạn có thể sử dụng các tính năng mới của XPath 2.0 và XSLT 2.0 để lặp duyệt qua các mẫu hình đó. Bản định kiểu cuối cùng là nhỏ hơn khoảng 70% so với phiên bản ban đầu (phải thừa nhận là vụng về). Trước khi bạn xây dựng bản định kiểu đó, chúng ta hãy xem xét cách cấu trúc lại mã.
## Cấu trúc lại mã - Tính toán các kiểu dáng ô của bảng
Để cấu trúc lại mã, hãy bắt đầu di chuyển thông tin kiểu dáng sang một bản
định kiểu CSS. Như bạn có thể thấy trong
[Hình 2](#fig2), bảng
khung HTML có 5 kiểu dáng ô khác nhau:
None,
MatchupStart,
MatchupMiddle,
MatchupEnd, và
Solid.
##### Hình 2. Các kiểu dáng đường viền ô trong bảng HTML
![ Các kiểu dáng đường viền ô trong bảng HTML](border-styles.gif)
[Liệt kê 7](#listing7) cho thấy mã CSS trông như thế nào.
##### Liệt kê 7. Bản định kiểu CSS
.None { width: 20%; } .MatchupStart { width: 20%; border: none; border-top: solid; border-right: solid; } .MatchupMiddle { width: 20%; border: none; border-right: solid; } .MatchupEnd { width: 20%; border: none; border-bottom: solid; border-right: solid; } .Solid { width: 20%; border: solid; }
Các kiểu dáng đường viền làm cho việc xem kết quả của giải đấu thành dễ
dàng. Các đường ngang nối hai ô cho biết rằng hai đối thủ nào đã đối đầu
với nhau; ô có đường viền liền nét trong cột tiếp sau cho thấy người chiến
thắng của cặp đấu này. Nhìn vào các kiểu dáng đường viền, bạn có thể thấy
một mẫu hình xác định: Đối với mỗi cặp đối thủ, các ô trước đối thủ đầu
tiên không có đường viền (kiểu dáng là
None),
các ô dành cho hai đối thủ có đường viền liền nét (kiểu dáng
Solid), các ô giữa hai đối thủ chỉ có đường
viền ở bên phải (kiểu dáng
MatchupMiddle), và
các ô sau đối thủ cuối cùng không có đường viền (kiểu dáng
None). Điều này hơi khác một chút so với cột
đầu tiên. Vì các cặp đối thủ trong cột đầu tiên là quá gần nhau, nên ô
dành cho đối thủ đầu tiên có một đường viền trên đỉnh và bên phải (kiểu
dáng
MatchupStart), và ô dành cho đối thủ thứ
hai có một đường viền dưới đáy và bên phải (kiểu dáng
MatchupEnd).
Lưu ý rằng các cặp đối thủ cách nhau xa hơn trong mỗi cột. Khoảng cách một ô giữa các đối thủ cột 1, khoảng cách ba ô ở cột 2, khoảng cách bảy ô ở cột 3, và khoảng cách 15 ô ở cột 4. Kích thước của mỗi khoảng cách bằng một lũy thừa hai trừ một, do đó, có một mẫu hình xác định ở đây.
Mẫu hình tổng quát xuyên suốt bảng này là mỗi cột có chứa một nhóm các ô
lặp lại. Kích thước của các nhóm lặp lại (mà tôi sẽ gọi là
*chu kỳ*
của cột, vì thiếu một thuật ngữ hay hơn) là 4, 8, 16, 32 và 64 trong năm
cột. Mỗi nhóm lặp lại có hai đối thủ, các ô giữa hai đối thủ và các ô
trước và sau hai đối thủ.
Trong mỗi cột, hãy sử dụng hai giá trị trong tính toán của bạn:
$period, là kích thước của nhóm lặp lại, và
$oneQuarter, bằng 1/4 kích thước của chu kỳ.
(Việc lưu
$period div 4 vào một biến làm cho mã
sạch hơn).
[Bảng 1](#table1) cho thấy các quy tắc tổng quát hóa
cho các kiểu dáng đường viền của ô.
##### Bảng 1. Các kiểu dáng đường viền của ô trong bảng HTML
|Công thức||Cột 1(chu kỳ 4)||Cột 2 (chu kỳ 8)||Cột 3 (chu kỳ 16)||Cột 4 (chu kỳ 32)||Cột 5 (chu kỳ 64)|
|N/A|Hàng 1, kiểu dáng Các hàng 1-3, kiểu dáng
Các hàng 1-7, kiểu dáng
Các hàng 1-15, kiểu dáng
Hàng 1, kiểu dáng
Hàng 2, kiểu dáng Hàng 4, kiểu dáng Hàng 8, kiểu dáng Hàng 16, kiểu dáng
Hàng 2, kiểu dáng
Các hàng 3-5, kiểu dáng
Các hàng 5-11, kiểu dáng
Các hàng 9-23, kiểu dáng
Các hàng 17-32, kiểu dáng
Hàng 3, kiểu dáng
Hàng 6, kiểu dáng Hàng 12, kiểu dáng Hàng 24, kiểu dáng |N/A|
Hàng 4, kiểu dáng Các hàng 7-8, kiểu dáng
Các hàng 13-16, kiểu dáng
Các hàng 25-32, kiểu dáng
|N/A|
Bây giờ bạn đã có một công thức đẹp đẽ để tìm ra kiểu dáng của bất kỳ ô cụ thể nào trong bảng. Cho trước số cột và số hàng, công thức làm việc như một phép màu.
## Cấu trúc lại mã - Tính toán nội dung ô trong bảng
Khi bạn tạo ra một ô trong bảng, tất nhiên, bạn cũng cần phải đưa nội dung
thích hợp vào trong ô đó. Việc này cũng có một mẫu hình thú vị. Bất cứ ô
nào có kiểu dáng là
None hoặc
MatchupMiddle đều không có bất kỳ nội dung nào.
Điều đó có nghĩa là bạn chỉ phải lo nghĩ về việc tìm kiếm các nội dung phù
hợp cho các ô có ba kiểu dáng khác còn lại.
Trong
[Bảng 1](#table1), bạn có thể thấy rằng các ô có nội dung
có thuộc tính
$row =
$oneQuarter .
Với cột đầu tiên, bạn chỉ cần viết số hạt giống và tên của đội thi đấu
thích hợp. Các cặp đấu đều dựa vào các cách chọn hạt giống và mô tả các
cặp đấu được thể hiện trong
*hoặc* $row = $period - $oneQuarter [Bảng 2](#table2).
##### Bảng 2. Các cặp đấu dựa vào cách chọn hạt giống
|[1] versus [16]|
|[8] versus [9]|
|[5] versus [12]|
|[4] versus [13]|
|[6] versus [11]|
|[3] versus [14]|
|[7] versus [10]|
|[2] versus [15]|
Các cặp đấu được bố trí sao cho nếu hạt giống xếp cao hơn luôn thắng, thì
đội xếp hạt giống cao nhất sẽ luôn đấu với đội xếp hạt giống thấp nhất còn
lại, đội xếp hạt giống thứ hai sẽ luôn đấu với đội xếp thứ hai từ dưới lên
còn lại, và v.v.. Nhìn vào các hạt giống theo thứ tự này (1, 16, 8, 9, 5,
12, 4, 13, 6, 11, 3, 14, 7, 10, 2, 15), bạn có thể thấy chúng phù hợp với
các giá trị trong
$seeds. Các đối thủ được hiển
thị trong cột 1 theo thứ tự này.
Đối thủ xuất hiện trong tất cả các hàng khác, có nghĩa là hàng 1 có hạt
giống đầu tiên trong dãy, hàng 3 có hạt giống thứ hai trong dãy, hàng 5
hạt giống thứ ba trong dãy, và v.v.. Ở đây mẫu hình là
$row + 1 div 2 =
$index. Nói cách
khác, lấy số hàng, cộng 1, và chia cho 2 để nhận được chỉ số của hạt giống
trong dãy
$seeds. Nội dung ô của bảng là số hạt
giống tiếp theo là tên của đối thủ có số hạt giống đó.
Mẫu hình trên bảo đảm nội dung cho cột 1. Với các cột từ 2 đến 5, như bạn
có thể dự kiến, sẽ phức tạp hơn. Thay vì xem xét các phần tử
<contestant>, bạn cần phải xem xét các
kết quả được hiển thị trong 15 phần tử
<result>.
Cột 2 chứa những đội thắng ở vòng 1. Điều đó có nghĩa là bạn cần phải xem
xét các phần tử
<result> có thuộc tính
round="1". Để giữ cho mọi thứ đơn giản hơn, đội
thắng của cặp đấu đầu tiên (hạt giống 1 đấu với 16) được lưu trữ trong
phần tử
<result> đầu tiên, đội thắng của
cặp đấu thứ hai (hạt giống 8 đấu với 9) được lưu trữ trong phần tử
<result> thứ hai , và v.v.. Những đội
thắng trong cột 2 được hiển thị trong các hàng 2, 6, 10, 14, 18, 22, 26,
và 30. Hãy tìm kiếm một mẫu hình, hàng 2 sử dụng phần tử
<result> đầu tiên, hàng 6 sử dụng phần tử
<result> thứ hai, và hàng 10 sử dụng phần tử <result> thứ ba. Với
cột này, nếu bạn lấy số hàng, cộng 2, và chia cho 4, bạn sẽ nhận được vị
trí của phần tử
<result round="1"> phù
hợp.
Cột 3 và 4 được xử lý tương tự. Những đội thắng trong cột 3 được hiển thị
trong các hàng 4, 12, 20, và 28 (mẫu hình ở đây là cộng 4 và chia cho 8).
Những đội thắng trong cột 4 được hiển thị trong hàng 8 và 24 (cộng 8 và
chia cho 16). Cột 5 hiển thị một đội duy nhất — đội thắng
của toàn bộ giải đấu. Nếu bạn đang ở hàng 16, bạn sẽ hiển thị đội thắng từ
phần tử
<result round="4">.
Cách cấu trúc lại để tìm vị trí của giá trị mà bạn tìm kiếm là
($row + $oneQuarter)
div ($oneQuarter * 2).
Việc tăng dần kích thước của mẫu hình lặp lại làm cho mã đơn giản. Với cột
1, vị trí tính được là chỉ số trong dãy các hạt giống; với các cột khác,
vị trí tính được là vị trí của phần tử
<result>.
Bây giờ bạn có một công thức đẹp đẽ để xác định cả nội dung lẫn kiểu dáng của mỗi ô trong bảng. Dựa vào số hàng và cột, bạn có thể tìm ra tất cả mọi thứ bạn cần biết.
## Khai thác sức mạnh của XPath 2.0 và XSLT 2.0
Bây giờ bạn có thể sử dụng các kỹ thuật mới trong XPath 2.0 và XSLT 2.0 để
trau chuốt bản định kiểu. Để bắt đầu, hãy sử dụng toán tử
to. Nếu bạn dựng bảng bằng một ngôn ngữ lập
trình thủ tục, bạn có thể làm điều gì đó tương tự như
[Liệt kê 8](#listing8).
##### Liệt kê 8. Cách tiếp cận thủ tục cho bảng định kiểu
for (int row=1; row<=32; row++) for (int column=1; column<=5; column++) // Build each cell in the table here
Với XPath 2.0 và XSLT 2.0, bạn sử dụng
<xsl:for-each> để thay thế các vòng lặp
for mà bạn sử dụng trong một ngôn ngữ thủ tục.
[Liệt kê 9](#listing9) cho bạn biết cách làm như thế
nào.
##### Liệt kê 9. Thực hiện vòng lặp
for với toán tử
to
<xsl:for-each select="1 to 32"> <xsl:variable name="outerIndex" select="."/>
 <xsl:for-each select="1 to 5">
Bạn cần phải giải quyết một vài tình tiết phức tạp ở đây. Đầu tiên, trong
XPath 1.0 và XSLT 1.0, việc sử dụng
<xsl:for-each> đã làm thay đổi ngữ cảnh
cho mỗi lần lặp. Ví dụ, nếu bạn sử dụng
<xsl:for-each
select="contestants/contestant>,
thì nút ngữ cảnh là
<contestant> mới nhất
trong mỗi lần lặp. Khi bạn sử dụng toán tử
to
để lặp duyệt qua các số nguyên khác nhau, mục ngữ cảnh (đó là ngữ cảnh
*item* trong 2.0) là *không xác định*. Như bạn có thể thấy
trong [Liệt kê 9](#listing9), bạn cần phải ghi lưu giá trị hiện
tại của
<xsl:for-each> bên ngoài bởi vì
nó không có sẵn cho bạn ở
<xsl:for-each>
bên trong.
Nhưng còn tệ hơn nữa. Nếu mục ngữ cảnh là không xác định,
*bạn không có
cách nào để chọn các nút từ tài liệu*. Nếu bạn biết bạn đang ở hàng
1, cột 1, bạn có thể nhận được mục đầu tiên từ dãy
$seeds vì
$seeds là
một biến chung. Điều đó nói cho bạn biết rằng bạn cần phải tìm phần tử
<contestant
seed="1">. Thật
không may, bạn không thể nhận được bất cứ điều gì trong tài liệu. Ngay cả
việc sử dụng một biểu thức XPath tuyệt đối như là
/bracket/contestants/contestant[@seed='1'] cũng
không thành công. Vì lý do đó, bạn cần lưu trữ các nút mà bạn quan tâm làm
các một biến chung.
[Liệt kê 10](#listing10) cho bạn thấy cách
truy cập các một biến chung, bất cứ khi nào và ở bất cứ nơi nào bạn
cần.
##### Liệt kê 10. Một biến chung lưu trữ các nút bạn cần
<xsl:variable name="results" select="/bracket/results"/> <xsl:variable name="contestants" select="/bracket/contestants"/>
Nếu bạn cần lấy tên của đội đấu hạt giống 16 , biểu thức XPath là
$contestants/contestant[@seed="16"]. Bạn truy
cập phần tử
<result> tương tự; nếu bạn
cần nhận được đội thắng trong cặp đấu thứ hai trong vòng 2, biểu thức là
$results/result[@round="2"][2]/@winnerSeed.
[Liệt kê 11](#listing11) cho thấy hai một biến chung nữa mà
bạn có thể sử dụng để tạo ra bảng HTML.
##### Liệt kê 11. Các một biến chung có ích khác
<xsl:variable name="periods" as="xs:integer*"> <xsl:sequence select="(4, 8, 16, 32, 64)"/> </xsl:variable> <xsl:variable name="backgroundColors" as="xs:string*"> <xsl:sequence select="('background: #CCCCCC;', 'background: #9999CC;', 'background: #99CCCC;', 'background: #CC99CC;', 'background: #CCCC99;')"/> </xsl:variable>
Các biến này lưu trữ giá trị của chu kỳ cho mỗi cột và màu nền cho mỗi cột. Để sử dụng từng biến, bạn chỉ cần sử dụng số cột làm chỉ số của giá trị duy nhất mà bạn muốn.
Một cải tiến thú vị trong XPath 2.0 và XSLT 2.0 là phần tử
<xsl:function>. Hãy tạo hai hàm trong bản
định kiểu là:
cellStyle và
getResults. Hàm đầu tiên trả về kiểu dáng đường
viền cho mỗi ô, trong khi hàm thứ hai trả về kết quả (nếu có) cho một cặp
đấu. Các tham số cho cả hai hàm là số hàng và cột của ô.
[Liệt kê 12](#listing12) trình bày mã cho hàm
cellStyle.
##### Liệt kê 12. Hàm
cellStyle
<xsl:function name="bracket:cellStyle" as="xs:string"> <xsl:param name="row" as="xs:integer"/> <xsl:param name="column" as="xs:integer"/> <xsl:variable name="period" as="xs:integer" select="subsequence($periods, $column, 1)"/> <xsl:variable name="oneQuarter" as="xs:integer" select="$period div 4"/> <xsl:variable name="lastColumn" as="xs:boolean" select="$oneQuarter = count($contestants/contestant)"/> <xsl:variable name="position" select="$row mod $period"/> <xsl:value-of select="if ($position = $oneQuarter) then (if ($column = 1) then 'MatchupStart' else 'Solid') else if ($position = $period - $oneQuarter) then (if ($column = 1) then 'MatchupEnd' else 'Solid') else if ($lastColumn) then 'None' else if ($position < $oneQuarter or $position > $period - $oneQuarter) then 'None' else 'MatchupMiddle'"/> </xsl:function>
Trước khi bạn xác định kiểu dáng ô, bạn sử dụng 4 biến. Bạn lấy ra giá trị
$period từ một biến chung
$periods. Như tôi đã đề cập ở trên,
$oneQuarter đơn giản là
$period div
4. Biến
$lastColumn kiểu boolean là kết quả so sánh
$oneQuarter với tổng số đội trong giải đấu. Nếu
các giá trị đó bằng nhau, bạn đang xử lý cột cuối cùng. Cuối cùng, biến
$position cho biết vị trí của hàng hiện tại
trong mẫu hình. Nói cách khác, hàng 9 trong bảng là hàng đầu tiên của nhóm
lặp lại cho các cột 1 và 2. Hãy sử dụng vị trí của hàng trong mẫu hình để
tìm ra kiểu dáng của ô.
XPath 2.0 và XSLT 2.0 có một toán tử
if, gồm một
biểu thức (trong ngoặc), tiếp sau là mệnh đề
then và mệnh đề
else. Toàn bộ các thành phần này nằm trong
thuộc tính
select của
<xsl:value-of>. Trong ví dụ này, bạn thay
thế phần tử
<xsl:choose> dài dòng hơn
nhiều bằng chỉ một biểu thức. Mã ở đây là khá đơn giản, dựa vào cuộc thảo
luận về các công thức bảng; nếu logic phức tạp hơn, thì có lẽ sử dụng
<xsl:choose>, sẽ dễ bảo trì hơn, mặc dù
nó đòi hỏi phải gõ bàn phím nhiều hơn.
Một số lưu ý về cú pháp cho hàm
<xsl:function>: Đầu tiên, bạn cần phải
khai báo một vùng tên mới cho các hàm này. Nếu bạn gọi
bracket:cellStyle() trong một biểu thức XPath,
vùng tên này sẽ cho bộ xử lý XSLT 2.0 biết cách tìm hàm này. Thứ hai, lưu
ý rằng bạn đã sử dụng thuộc tính
as="xs:string"
để chỉ ra rằng hàm này trả về một chuỗi. Phần tử
<xsl:value-of> trả về một trong năm tên
kiểu dáng, đó là đầu ra của hàm.
Hàm
getResults có phức tạp hơn một chút, nhưng
không nhiều, bạn có thể thấy trong
[Liệt kê
13](#listing13).
##### Liệt kê 13. Hàm
getResults
<xsl:function name="bracket:getResults" as="xs:string"> <xsl:param name="row" as="xs:integer"/> <xsl:param name="column" as="xs:integer"/> <xsl:variable name="period" as="xs:integer" select="subsequence($periods, $column, 1)"/> <xsl:variable name="oneQuarter" as="xs:integer" select="$period div 4"/> <xsl:variable name="position" select="$row mod $period"/> <xsl:choose> <xsl:when test="$position = $oneQuarter or $position = $period - $oneQuarter"> <xsl:variable name="round" select="$column - 1"/> <xsl:variable name="index" select="($row + $oneQuarter) div ($oneQuarter * 2)"/> <xsl:variable name="currentSeed" select="if ($column = 1) then subsequence($seeds, $index, 1) else $results/result[@round=$round][$index]/@winnerSeed"/> <xsl:choose> <xsl:when test="string-length(string($currentSeed))"> <xsl:value-of select="concat('[', $currentSeed, '] ', $contestants/contestant[@seed=$currentSeed])"/> </xsl:when> <xsl:otherwise> <xsl:text> </xsl:text> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:text> </xsl:text> </xsl:otherwise> </xsl:choose> </xsl:function>
Bạn có các tham số tương tự như trước đây. Bạn phải làm một số việc xử lý
đặc biệt ở đây cho cột 1, có chứa dữ liệu từ các phần tử
<contestant>, trong khi các cột khác chứa
dữ liệu từ các phần tử
<result>. Cũng
giống như với hàm
cellStyle bạn tính toán
$period và
$position, và bạn sử dụng biến
$oneQuarter để đơn giản hóa các công thức.
Nếu ô chứa một đội thi đấu, bạn tính toán thêm ba biến. Biến
$round là số cột trừ đi một (cột 2 chứa kết quả
của vòng 1), và bạn tính toán biến
$index theo
công thức thảo luận ở trên.
Bạn cần phải làm theo hai bước để tìm dữ liệu thích hợp. Đầu tiên, thiết
lập giá trị của biến
$currentSeed. Nếu đây là
vòng 1, bạn sử dụng hàm
subsequence mới để chọn
một giá trị từ biến
$seeds. Đối với các vòng
khác, bạn lấy thuộc tính
winnerSeed từ phần tử
<result> thích hợp.
Thứ hai, ngoài việc xử lý cột 1 khác đi, bạn cần tính đến khả năng có một
phần tử
<result> không có đội thắng
(
winnerSeed=""). Nếu điều đó xảy ra, hãy trả về
một khoảng trống cứng (
 ). Theo cách
XSLT 2.0 xử lý các kiểu dữ liệu (đây là một chủ đề cho một bài viết sắp
tới), bạn cần phải chuyển đổi
$currentSeed
thành một chuỗi, rồi kiểm tra độ dài của chuỗi. Nếu chiều dài của chuỗi
bằng không, hãy trả về một khoảng trống cứng; ngược lại, hãy trả về hạt
giống và tên của đội thi đấu.
Cuối cùng, lưu ý rằng bạn sử dụng hàm
<xsl:choose> ở đây. Mặc dù bạn có thể làm
mọi thứ với chỉ một câu lệnh
if của XPath, mã
sẽ rất cồng kềnh. Mặc dù hàm
<xsl:choose>
dài dòng hơn, mã sạch hơn và dễ hiểu hơn.
Bây giờ khi bạn đã thiết lập các một biến chung và các hàm mà bạn cần,
trọng tâm của bản kiểu định kiểu là đơn giản và đẹp đẽ, bạn có thể thấy
trong
[Liệt kê 14](#listing14).
##### Liệt kê 14. Trọng tâm của bản định kiểu
<xsl:for-each select="1 to 32"> <xsl:variable name="outerIndex" select="."/>
 <xsl:for-each select="1 to 5">  <xsl:value-of select="bracket:getResults($outerIndex, .)"/> 	 </xsl:for-each>
 </xsl:for-each>
Bạn có hai vòng lặp tạo ra 5 cột với 32 hàng của bảng. Đối với mỗi ô, màu
nền được dựa vào số cột hiện tại. Hàm
cellStyle
xác định kiểu dáng đường viền (
class="x"), và
hàm
getResults xác định giá trị của ô.
## Sử dụng bản định kiểu
Như bạn đã có thể dự kiến, cần một trình xử lý XSLT 2.0 để sử dụng bản định
kiểu này. Tôi sẽ không in lại toàn bộ bản định kiểu ở đây, nhưng bạn phải
sử dụng
<xsl:stylesheet version="2.0"> để
cho trình xử lý sẽ chạy ở chế độ XSLT 2.0. Tôi rất khuyến cáo nên dùng
trình xử lý Saxon của Michael Kay (xem phần
[Tài
nguyên](#resources) để biết thêm chi tiết). Tiến sĩ Kay vốn là người soạn thảo
đặc tả XSLT 2.0, và Saxon, theo một vài phương diện, đã là một ca kiểm thử
khi đặc tả này đang được phát triển. Nếu bạn sử dụng Saxon, hãy dùng lệnh
dưới đây để biến đổi tệp XML
tourney.xml bằng
cách sử dụng bản định kiểu
results-html.xsl và
viết đầu ra cho tệp
results.html:
java net.sf.saxon.Transform -o results.html tourney.xml
results-html.xsl
Để minh họa cho tính linh hoạt của bản định kiểu này, hãy lấy ra một vài
kết quả trong tệp XML và chạy phép biến đổi này.
[Liệt
kê 15](#listing15) cho thấy phần tử
<result>
trông như thế nào.
##### Liệt kê 15. Tài liệu XML với dữ liệu giải đấu chưa hoàn thành
<?xml version="1.0" encoding="UTF-8"?>
<bracket> . . . <results> <result round="1" firstSeed="1" secondSeed="16" winnerSeed="1"/> <result round="1" firstSeed="8" secondSeed="9" winnerSeed="9"/> <result round="1" firstSeed="5" secondSeed="12" winnerSeed="5"/> <result round="1" firstSeed="4" secondSeed="13" winnerSeed="4"/> <result round="1" firstSeed="6" secondSeed="11" winnerSeed="11"/> <result round="1" firstSeed="3" secondSeed="14" winnerSeed="3"/> <result round="1" firstSeed="7" secondSeed="10" winnerSeed="10"/> <result round="1" firstSeed="2" secondSeed="15" winnerSeed="2"/> <result round="2" firstSeed="" secondSeed="" winnerSeed=""/> <result round="2" firstSeed="" secondSeed="" winnerSeed=""/> <result round="2" firstSeed="" secondSeed="" winnerSeed=""/> <result round="2" firstSeed="" secondSeed="" winnerSeed=""/> <result round="3" firstSeed="" secondSeed="" winnerSeed=""/> <result round="3" firstSeed="" secondSeed="" winnerSeed=""/> <result round="4" firstSeed="" secondSeed="" winnerSeed=""/> </results> </bracket> [Liệt kê 15](#listing15) biểu diễn trạng thái của giải đấu sau
vòng đầu tiên. Tất cả các phần tử
<result> cho vòng 2, 3, và 4 có một thuộc
tính trống
winnerSeed. Mặc dù vậy, bản định
kiểu tạo ra khung bảng chính xác, bạn có thể thấy trong
[Hình 3](#fig3).
##### Hình 3. Khung bảng cho một giải đấu chưa hoàn thành
![ Khung bảng chưa hoàn thành](incomplete-results.gif)
## Tóm tắt
Bài viết này đã trình diễn nhiều tính năng mới của XPath 2.0 và XSLT 2.0.
Trong ứng dụng mẫu, bạn đã chọn một bản định kiểu cồng kềnh và đã cấu trúc
lại nó thành một đoạn mã nhỏ hơn nhiều và dễ bào trì hơn. Một phần nỗ lực
của bạn là để phân tích mã nhằm tìm ra các mẫu hình, nhưng nếu không có
toán tử
to, hàm
<xsl:function>, và dãy các mục, thì việc
sắp xếp hợp lý bảng định kiểu nhiều như bạn đã làm sẽ rất khó khăn.
Đáng kể nhất, bạn đã tạo ra các hàm chung có thể xử lý bất kỳ số lượng đối
thủ nào. Ví dụ, để thay đổi bản định kiểu nhằm xử lý một giải đấu có 32
đội, bạn cần phải thay đổi các dãy
$seeds và
$periods. Bạn cũng cần thay thế
select="1 to
5" bằng
select="1 to $rounds", ở đây
$rounds là số vòng thi đấu trong giải đấu. Tất
nhiên, giải pháp đẹp đẽ nhất là tạo ra hàm XSLT 2.0 tính toán các giá trị
cho bất kỳ khung bảng chung nào, bao gồm cả số vòng đấu, dãy các hạt giống
(một khung bảng 32-đội mô tả các cặp đấu giữa 1 và 32, 2 và 31, và v.v..),
và các chu kỳ cho các cột khác nhau. Thách thức này được để dành làm một
bài tập cho người đọc.
Cốt lõi của vấn đề là bạn cần lặp duyệt qua 32 hàng của bảng, nhưng XSLT 1.0 không cung cấp cho bạn cách nào thiết thực nào để làm điều đó. Các tính năng mới của XPath 2.0 và XSLT 2.0 giúp bạn giải quyết vấn đề này.
## Tải về
|Mô tả||Tên||Kích thước|
|XML, XSLT, and HTML code samples|
## Tài nguyên
### Học tập
[XSLT là loại ngôn ngữ gì?](http://www.ibm.com/developerworks/library/x-xslt/?S_TACT=105AGY75)(Michael Kay, developerWorks, 04. 2005): Hãy đặt ngôn ngữ XSLT trong bối cảnh với bài viết này về triết lý thiết kế đằng sau nó, nó xuất phát từ đâu, nó dùng để làm gì, và tại sao lại sử dụng nó. [Kế hoạch nâng cấp XSLT 1.0 lên 2.0](http://www.ibm.com/developerworks/views/xml/libraryview.jsp ?search_by=Planning+to+upgrade+XSLT+1.0+to+2.0&S_TACT=105AGY75)(David Marston, Joanne Tong, và Henry Zongaro; developerWorks) Trong loạt bài này, hãy tìm hiểu cách di chuyển các bản định kiểu của bạn từ XSLT 1.0 lên tiêu chuẩn mới. [Trang Họ ngôn ngữ bản định kiểu mở rộng](http://www.w3.org/Style/XSL/): Tìm tất cả các khuyến nghị mới cho XSLT 2.0, XPath 2.0, XQuery 1.0, và các đặc tả khác đã trở thành khuyến nghị chính thức của W3C (World Wide Web Consortium) vào ngày 23.01.2007. Toàn bộ định nghĩa ngôn ngữ bao gồm một số đặc tả. [Chứng chỉ XML của IBM](http://www.ibm.com/certify/certs/xmsdreltop.shtml): Tìm hiểu cách bạn có thể trở thành một nhà phát triển có chứng chỉ của IBM về XML và các công nghệ liên quan. [Thư viện kỹ thuật XML](http://www.ibm.com/developerworks/views/xml/library.jsp?S_TACT=105AGY75): Xem Vùng XML của developerWorks để thấy một vùng rộng lớn các bài viết kỹ thuật và các lời khuyên, các hướng dẫn, các tiêu chuẩn, và các sách Đỏ của IBM. [Các sự kiện kỹ thuật và Webcast của developerWorks](http://www.ibm.com/developerworks/offers/techbriefings/?S_TACT=105AGY75): Theo sát với công nghệ trong các phiên này. [Kho sách kỹ thuật](http://www.ibm.com/developerworks/apps/SendTo?bookstore=safari&S_TACT=105AGY75): Duyệt qua các sách về chủ đề này và các chủ đề khác.
### Lấy sản phẩm và công nghệ
[Trình xử lý Saxon XSLT 2.0](http://sourceforge.net/projects/saxon/): Tìm trình xử lý của Michael Kay trên SourceForge. [Trang XML của Altovatrên trang web Altova](http://www.altova.com/altovaxml.html): Nhận thông tin và dùng thử trình xử lý Altova XSLT. Altova, nhà sản xuất XMLSpy và các sản phẩm phổ biến khác, cung cấp bộ xử lý XSLT của mình có sẵn miễn phí. Nó hỗ trợ XSLT 1.0, XSLT 2.0, và XQuery 1.0. Mặc dù nó không phải mã nguồn mở, nhưng giấy phép của nó cho phép bạn nhúng máy XSLT vào trong các sản phẩm của bạn. [Phần mềm dùng thử IBM](http://www.ibm.com/developerworks/downloads/?S_TACT=105AGY75): Xây dựng dự án phát triển tiếp theo của bạn với phần mềm dùng thử có sẵn để tải trực tiếp từ developerWorks.
### Thảo luận
[Các diễn đàn thảo luận lĩnh vực XML](http://www.ibm.com/developerworks/forums/dw_xforums.jsp?S_TACT=105AGY75): Tham gia vào bất kỳ các cuộc thảo luận nào liên quan đến XML. [Các blog developerWorks](http://www.ibm.com/developerworks/blogs/?S_TACT=105AGY75): Đọc các blog này và dành thời gian cho [cộng đồng developerWorks](http://www.ibm.com/developerworks/community?S_TACT=105AGY75).
## Bình luận
[Vùng dữ liệu trên developerWorks](http://www.ibm.com/developerworks/vn/views/data/libraryview.jsp)
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
[Vùng mã nguồn mở trên developerWorks](http://www.ibm.com/developerworks/vn/views/opensource/libraryview.jsp)
Xem các bài viết về HTML, CSS, JavaScript,...
[Điện toán đám mây](http://www.ibm.com/developerworks/vn/views/cloud/libraryview.jsp)
Tìm hiểu về điện toán đám mây

Content-Encoding: gzip

Content-Type: text/html; charset=UTF-8

Content-Language: en-US

Kp-eeAlive: timeout=10, max=74

Vary: Accept-Encoding


text:
Dịch vụ lãnh sự
hanoi-vi
86
dd.MM.yyyy
Turn on more accessible mode
Turn off more accessible mode
English
|
Tiếng Việt
PHÁI ĐOÀN NGOẠI GIAO ISRAEL
Đại sứ quán Israel tại Việt Nam
Chuyển tới nội dung
sơ đồ trang
Hanoi-Vi
Đại sứ quán
Đại sứ
Các tài liệu
Liên lạc với chúng tôi
Dịch vụ lãnh sự
Currently selected
Dịch vụ lãnh sự
Visa vào Israel
Ý kiến phản hồi
Văn phòng Hỗ trợ du lịch
Phòng Visa tạm nghỉ ngày 16.9.2014
Các phòng ban
MASHAV
Kinh tế & Thương mại
Văn hóa
Hoạt động từ thiện
Quan hệ song phương
Dự án hợp tác
Tin tức và sự kiện
Lịch sự kiện
About Israel
Spot lights on Israel
Culture
Economy
Education
Health & Social Services
History
Land
People
Science & Technology
State
The Middle East
Cảm nhận
Israeli Missions Around The World
Hanoi-Vi
Dịch vụ lãnh sự
Dịch vụ lãnh sự
Dịch vụ lãnh sự
Dịch vụ lãnh sự
Visa vào Israel
Ý kiến phản hồi
Văn phòng Hỗ trợ du lịch
Phòng Visa tạm nghỉ ngày 16.9.2014
Công cụ & Thông tin
Liên hệ
FAQs
Israel tại các nước
Rss
Các ấn phẩm
Dịch vụ lãnh sự
mfa_RichImage2
GovXContentSection
•
Dịch vụ lãnh sự
•
Visa
•
Các mẫu biểu
•
Biểu phí lãnh sự
Thông tin cơ bản:
a. Địa chỉ Đại sứ quán:
68 Nguyễn Thái Học, Hà Nội
b. Giờ tiếp nhận dịch vụ lãnh sự:
Thứ Hai đến thứ Năm:
Sáng:9:30 – 12:00
Chiều:13:00-14:00
Thứ Sáu:
Sáng: 9:30-12:30
Chiều: Nghỉ
Xin vui lòng đặt lịch hẹn trước với Đại sứ quán
Danh sách các ngày nghỉ lễ của Đại sứ quán (phòng lãnh sự không làm việc)
c. Liên hệ:
Số điện thoại: 84-4-38433140 (Số máy lẻ 502, 507, 516)
d. Khu vực áp dụng:
Việt Nam + Lào
e. Hướng dẫn về thủ tục an ninh cho người đến làm dịch vụ lãnh sự tại Đại sứ quán:
1. Mang ảnh CMTND/Hộ chiếu.
2. Người đến làm dịch vụ và tư trang sẽ được yêu cầu kiểm tra an ninh.
3. Vì lý do an ninh, không được mang vật dụng cá nhân vào bên trong đại sứ quán: túi xách, điện thoại, và đồ điện tử.
4. Không mang túi to hay va li vào Đại sứ quán.
5. Không mang chai, lọ đựng thực phẩm/đồ uống.
6. Các hướng dẫn an ninh của Đại sứ quán áp dụng đối với người đến làm dịch vụ tại phòng chờ lãnh sự. Các yêu cầu của nhân viên an ninh cần phải được chấp hành..
f. Gửi tài liệu tới Đại sứ quán:
Tài liệu gửi tới Phòng Lãnh sự của Đại sứ quán phải được gửi tới địa chỉ sau:
Đại sứ quán Israel - Phòng lãnh sự
68 Nguyễn Thái Học, Hà Nội
Người gửi chịu hoàn toàn trách nhiệm đối với bưu phẩm gửi tới Đại sứ quán.
Trong một số trường hợp cần phải đến làm trực tiếp tại Đại sứ quán. Xem phần 2 mục Dịch vụ lãnh sự để biết thêm chi tiết.
g.
Danh sách công ty luật làm dịch vụ chứng nhận tư pháp
:
Đây là danh sách các công ty luật làm dịch vụ chứng nhận tư pháp khi cần. Đại sứ quán không được phép chỉ định.
Đại sứ quán không chỉ định sử dụng dịch vụ của bất kì công ty nào trong danh sách. Người sử dụng dịch vụ có trách nhiệm hoàn toàn..
h. Chứng thực tài liệu:
Chứng thực tài liệu ở một nước chưa gia nhập Công ước Hague cần phải thực hiện theo các bước sau:
Sau khi tài liệu được chứng thực bởi cơ quan có thẩm quyền ở nước ngoài (Thường là Bộ Ngoại giao hoặc Bộ Tư Pháp), văn phòng đại diện lãnh sự của Israel tại nước đó sẽ xác nhận chữ kí và con dấu của cơ quan có thẩm quyền.
i. Liên hệ và thắc mắc về cải thiện dịch vụ
Có thể gửi email tới địa chỉ:
info@hanoi.mfa.gov.il
. Để phản hồi về chất lượng dịch vụ, theo đường link sau:
http://www.mfa.gov.il/mfaheb/feedbackform.htm
Bản in
E-mail to a friend
mfaFooter
Contact us
Site map

Cache-Control: private, max-age=0

X-MS-InvokeApp: 1; RequireReadOnly


text:
Nhà máy sản xuất: xã An Mỹ, huyện Tuy An, tỉnh Phú Yên, Việt Nam | Tel: 84-57-3789488/9 | Email: info@jrd.com.vn | Web: www.jrd.com.vn
Khi Quý khách hàng mua xe ô tô tải hiệu JRD tại hệ thống các đại lý xe ô tô JRD ở các tỉnh thành trên toàn quốc, Quý khách sẽ được hỗ trợ 100% lệ phí trước bạ. Chương trình áp dụng trên toàn quốc. Mọi chi tiết xin vui long liên hệ:
1.Xe ô tô: Ms Tố Quyên 0914.221.463
2.Mâm đúc ô tô: Mr Chii 09433.009.09
1
NỘI THẤT Ô TÔ PHI LONG
TP. ĐÔNG HÀ - QUẢNG TRỊ
ĐT: 0913456083
2
CƠ SỞ MINH SỞ
ĐƯỜNG NÚI THÀNH - TP. ĐÀ NẴNG
ĐT: 0935892131
3
LÀM LỐP THÀNH
NGUYỄN TRI PHƯƠNG - TP. ĐÀ NẴNG
ĐT: 01282752555
4
NỘI THẤT Ô TÔ ĐẠI MỸ
ĐƯỜNG 9/2 TP. ĐÀ NẴNG
ĐT: 0986122.919
5
ĐẠI BẢO AN
TP. ĐÀ NẴNG
ĐT: 0985945664
6
CTY TNHH KD TỔNG HỢP ÂN ĐIỂN
96 ĐIỆN BIÊN PHỦ - TP ĐÀ NẴNG
ĐT: 0511 3712968
7
NỘI THẤT Ô TÔ PHẠM GIA
ĐƯỜNG 3/2 TP. ĐÀ NẴNG
ĐT: 0905399935
8
TRUNG TÂM LÀM ĐẸP LỢI PHÁT
TP. ĐỒNG HỚI – QUẢNG BÌNH
ĐT: 097 7771111
9
NỘI THẤT Ô TÔ TRUNG PHƯƠNG
TP. HÀ TĨNH – HÀ TĨNH
ĐT: 0913 090746
10
NỘI THẤT Ô TÔ NGỌC HÀ
TP. VINH – NGHỆ AN
ĐT: 0904 122300
11
LÀM LỐP Ô TÔ THÀNH HƯNG
ĐT: 0915 617777


text:
KDC TĂNG NHƠN PHÚ B QUẬN 9
KDC Tăng Nhơn Phú B quận 9 trên đường Dương Đình Hội, ngay chợ Tăng Nhơn Phú B, sổ đỏ. Diện tích 80 - 129 m2. Chỉ 700 triệu đồng/nền.
KDC TĂNG NHƠN PHÚ B QUẬN 9
ĐẤT KDC TĂNG NHƠN PHÚ B QUẬN 9
"Chính thức mở bán đất nền chợ Tăng Nhơn Phú B quận 9 quy mô 1,6 ha – 108 nền."
Chỉ cần 700 triệu đồng sở ngay nền đất sổ đỏ 80 m2 KDC Tăng Nhơn Phú B quận 9.
Thanh toán linh hoạt trong vòng 12 tháng
Số lượng có hạn. Gọi ngay Mr.Vinh_0906.999.169 để chọn cho mình vị trí tốt nhất
Phối cảnh nhà mẫu khu dân cư
Đất sổ đỏ Tăng Nhơn Phú B quận 9
Ngay vị trí đắc địa, giao thông thuận lợi, liền kề chợ Tăng Nhơn Phú B, trên tuyến đường Dương Đình Hội và Lê Văn Việt giáp ranh với ngã tư Thủ Đức.
Nằm trong tổng thể Trung Tâm Hành Chính quận 9, khu thương mại, buôn bán sầm uất. Kết nối các công trình trọng điểm trong bán kính 3km: Siêu thị Coopmart, đại học sư phạm kỹ thuật, bệnh viện Đa Khoa và UBND quận 9…
Tiếp giáp với Trung Tâm Hành Chính quận 2 và liên thông với chợ Bến Thành thông qua tuyến Tàu điện ngầm Bến Thành – Suối Tiên.
Vị trí đất
Giá bán: Chỉ từ 700 triệu đồng/nền 80 m2
Đa dạng diện tích từ: 80 m2, 90 m2, 100 m2, 115 m2, 129 m2
Pháp lý: cam kết sổ đỏ từng nền, xây dựng tự do
Sản phẩm phân phối độc quyền. LH: Mr.Vinh_0906.999.169
Dự án đang trong giai đoạn hoàn thiện cơ sở hạ tầng
Hình thực tế
Anh thực tế.h1
Anh thực tế.h2
Bình luận
SẢN PHẨM LIÊN QUAN
-
NAM SÀI GÒN RIVERSIDE
Nam Sài Gòn Riverside – Nơi Hạnh Phúc Bắt Đầu. Nhà ở giá rẻ dành cho nhu cầu thực tại Thành Phố Hồ Chí Minh. Sự kiện chào đón năm 2014 chỉ 680 triệu/ nhà & đất diện tích từ 50m2 – 90m2.
-
KHU DÂN CƯ SINH THÁI THANH BÌNH
Khu dân cư sinh thái Thanh Bình giá chỉ từ 500 triệu - 700 triệu/nền. Diện tich 50m2-70m2. Chủ quyền cá nhân, xây dựng tự do.
-
KDC HIM LAM TÂN HƯNG
Bán đất KDC Him Lam Tân Hưng quận 7 giá rẽ, từ 36 triệu/m2. Giao thông thuận tiện, cơ sở hạ tầng đồng bộ, khu dân trí cao. Ms.Thu Ba_0909111194
-
KHU DÂN CƯ PHÚ MỸ VẠN PHÁT HƯNG
Khu Dân Cư Phú Mỹ Vạn Phát Hưng đường Hoàng Quốc Việt, Phường Phú Mỹ, Quận 7, TP.Hồ Chí Min, Công ty CP Vạn Phát Hưng làm Chủ Đầu Tư
SẢN PHẨM CÙNG DANH MỤC
-
NAM SÀI GÒN RIVERSIDE
Nam Sài Gòn Riverside – Nơi Hạnh Phúc Bắt Đầu. Nhà ở giá rẻ dành cho nhu cầu thực tại Thành Phố Hồ Chí Minh. Sự kiện chào đón năm 2014 chỉ 680 triệu/ nhà & đất diện tích từ 50m2 – 90m2.
-
KHU DÂN CƯ SINH THÁI THANH BÌNH
Khu dân cư sinh thái Thanh Bình giá chỉ từ 500 triệu - 700 triệu/nền. Diện tich 50m2-70m2. Chủ quyền cá nhân, xây dựng tự do.
-
KDC HIM LAM TÂN HƯNG
Bán đất KDC Him Lam Tân Hưng quận 7 giá rẽ, từ 36 triệu/m2. Giao thông thuận tiện, cơ sở hạ tầng đồng bộ, khu dân trí cao. Ms.Thu Ba_0909111194
-
KHU DÂN CƯ PHÚ MỸ VẠN PHÁT HƯNG
Khu Dân Cư Phú Mỹ Vạn Phát Hưng đường Hoàng Quốc Việt, Phường Phú Mỹ, Quận 7, TP.Hồ Chí Min, Công ty CP Vạn Phát Hưng làm Chủ Đầu Tư

markdown:
#
KDC TĂNG NHƠN PHÚ B QUẬN 9
KDC Tăng Nhơn Phú B quận 9 trên đường Dương Đình Hội, ngay chợ Tăng Nhơn Phú B, sổ đỏ. Diện tích 80 - 129 m2. Chỉ 700 triệu đồng/nền.
## KDC TĂNG NHƠN PHÚ B QUẬN 9
**ĐẤT KDC TĂNG NHƠN PHÚ B QUẬN 9 ** *"Chính thức mở bán đất nền chợ Tăng Nhơn Phú B quận 9 quy mô 1,6 ha – 108 nền."* **. Chỉ cần 700 triệu đồng sở ngay nền đất sổ đỏ 80 m2 KDC Tăng Nhơn Phú B quận 9** *Thanh toán linh hoạt trong vòng * *12* * tháng* **Số lượng có hạn. Gọi ngay ** **Mr.Vinh_** **0906.999.169** **để chọn cho mình vị trí tốt nhất** **Phối cảnh nhà mẫu khu dân cư**
*Đất sổ đỏ Tăng Nhơn Phú B quận 9 *
Ngay vị trí đắc địa, giao thông thuận lợi, liền kề chợ Tăng Nhơn Phú B, trên tuyến đường Dương Đình Hội và Lê Văn Việt giáp ranh với ngã tư Thủ Đức.
Nằm trong tổng thể Trung Tâm Hành Chính quận 9, khu thương mại, buôn bán sầm uất. Kết nối các công trình trọng điểm trong bán kính 3km: Siêu thị Coopmart, đại học sư phạm kỹ thuật, bệnh viện Đa Khoa và UBND quận 9…
Tiếp giáp với Trung Tâm Hành Chính quận 2 và liên thông với chợ Bến Thành thông qua tuyến Tàu điện ngầm Bến Thành – Suối Tiên.
**Vị trí đất **
Giá bán: Chỉ từ 700 triệu đồng/nền 80 m2
Đa dạng diện tích từ: 80 m2, 90 m2, 100 m2, 115 m2, 129 m2
Pháp lý:
**cam kết sổ đỏ từng nền, xây dựng tự do**
Sản phẩm phân phối độc quyền. LH: Mr.Vinh_0906.999.169
Dự án đang trong giai đoạn hoàn thiện cơ sở hạ tầng
*Hình thực tế * **Anh thực tế.h1**
**Anh thực tế.h2**
[RSS](http://www.muacanho.vn/chi-tiet-rss-13226.rss)| [Bản để in](/imxu76o4enmx75lkw74i715lkarjwqoi13226.html)| [Bản gửi email](/ioxu76o4enmx75lkw74i715lkarjwqoi13226.html)
Bình luận
SẢN PHẨM LIÊN QUAN
-
[NAM SÀI GÒN RIVERSIDE](/dat-nen/nam-sai-gon-riverside.html)
Nam Sài Gòn Riverside – Nơi Hạnh Phúc Bắt Đầu. Nhà ở giá rẻ dành cho nhu cầu thực tại Thành Phố Hồ Chí Minh. Sự kiện chào đón năm 2014 chỉ 680 triệu/ nhà & đất diện tích từ 50m2 – 90m2.
-
[KHU DÂN CƯ SINH THÁI THANH BÌNH](/dat-nen/khu-dan-cu-sinh-thai-thanh-binh.html)
Khu dân cư sinh thái Thanh Bình giá chỉ từ 500 triệu - 700 triệu/nền. Diện tich 50m2-70m2. Chủ quyền cá nhân, xây dựng tự do.
-
[KDC HIM LAM TÂN HƯNG](/dat-nen/kdc-him-lam-tan-hung.html)
Bán đất KDC Him Lam Tân Hưng quận 7 giá rẽ, từ 36 triệu/m2. Giao thông thuận tiện, cơ sở hạ tầng đồng bộ, khu dân trí cao. Ms.Thu Ba_0909111194
-
[KHU DÂN CƯ PHÚ MỸ VẠN PHÁT HƯNG](/dat-nen/khu-dan-cu-phu-my-van-phat-hung.html)
Khu Dân Cư Phú Mỹ Vạn Phát Hưng đường Hoàng Quốc Việt, Phường Phú Mỹ, Quận 7, TP.Hồ Chí Min, Công ty CP Vạn Phát Hưng làm Chủ Đầu Tư
SẢN PHẨM CÙNG DANH MỤC
-
[NAM SÀI GÒN RIVERSIDE](/dat-nen/nam-sai-gon-riverside.html)
Nam Sài Gòn Riverside – Nơi Hạnh Phúc Bắt Đầu. Nhà ở giá rẻ dành cho nhu cầu thực tại Thành Phố Hồ Chí Minh. Sự kiện chào đón năm 2014 chỉ 680 triệu/ nhà & đất diện tích từ 50m2 – 90m2.
-
[KHU DÂN CƯ SINH THÁI THANH BÌNH](/dat-nen/khu-dan-cu-sinh-thai-thanh-binh.html)
Khu dân cư sinh thái Thanh Bình giá chỉ từ 500 triệu - 700 triệu/nền. Diện tich 50m2-70m2. Chủ quyền cá nhân, xây dựng tự do.
-
[KDC HIM LAM TÂN HƯNG](/dat-nen/kdc-him-lam-tan-hung.html)
Bán đất KDC Him Lam Tân Hưng quận 7 giá rẽ, từ 36 triệu/m2. Giao thông thuận tiện, cơ sở hạ tầng đồng bộ, khu dân trí cao. Ms.Thu Ba_0909111194
-
[KHU DÂN CƯ PHÚ MỸ VẠN PHÁT HƯNG](/dat-nen/khu-dan-cu-phu-my-van-phat-hung.html)
Khu Dân Cư Phú Mỹ Vạn Phát Hưng đường Hoàng Quốc Việt, Phường Phú Mỹ, Quận 7, TP.Hồ Chí Min, Công ty CP Vạn Phát Hưng làm Chủ Đầu Tư