XSLT giống như một trình soạn thảo
XSLT cho phép bạn chuyển đổi dữ liệu XML sang bất kỳ định dạng dữ liệu khác. Thông thường XSLT được hiểu như một ngôn ngữ chuyển đổi XML-tới-XML, lấy một tài liệu XML như một đầu vào và chuyển đổi nó sang cấu trúc XML khác (bao gồm XHTML), nhưng thực sự nó có thể được sử dụng để tạo ra cả các đầu ra, chứ không chỉ XML. Khi được hiểu theo cách này, một biểu mẫu XSLT thực sự là một công cụ để xác định các ngôn ngữ mới, và có thể hiểu như một trình soạn thảo ngôn ngữ. Cách sử dụng từ trình soạn thảo có vẻ như khá kỳ lạ. Thông thường, bạn nghĩ về một trình soạn thảo như là một ngôn ngữ chuyển các mã mà con người có thể đọc được sang ngôn ngữ máy móc hoặc mã dữ liệu cơ sở bộ máy ảo. Ngôn ngữ đích thường, nhưng không phải luôn luôn, là một định dạng nhị phân giống như mã máy. Theo nghĩa này, XSLT là một công nghệ trình soạn thảo. Một biểu mẫu XSLT xác định ngầm hiểu một ngôn ngữ mới, một phương thức ngôn ngữ XML, mà nó soạn thảo một số mẫu khác, có thể là một phương thức XML khác hoặc một số ngôn ngữ khác.
Một ví dụ khái niệm của XSLT như là một trình soạn thảo, nếu bạn muốn tạo
ra mã Java™ từ XML, có thể tạo ra Java beans (một mô hình
thành phần) như là một phần của hệ thống ánh xạ quan hệ đối tượng
(object-relational), bạn cũng có thể làm như vậy khi sử dụng. Một Java
bean là một lớp Java với một cấu trúc xây dựng định sẵn (cái mà không có
những phản đối), mà biểu hiện phương pháp getter và setter để người yêu cầu
đọc và thiết lập các đặc tính của đối tượng. Ví dụ 1 đưa ra một ví dụ của
tài liệu XML định nghĩa một lớp Java bean trong một ngôn ngữ dựa trên
XML.
Ví dụ 1. Tài liệu XML xác định một lớp Java bean
<java>
<bean-class name="Employee">
<property name="id" type="int"/>
<property name="name" type="String"/>
<property name="title" type="String"/>
</bean-class>
</java>
|
Tài liệu XML này tạo một thành phần <bean-class>, chỉ định nhiều đặc tính, với tên và loại Java kèm theo. Đây là một ngôn ngữ khá chính xác (như XML) để xác định một lớp Java bean trên khía cạnh các đặc tính của nó. Ví dụ 2 thể hiện XSLT, tạo ra mã Java từ XML này.
Ví dụ 2. XSLT tạo ra một lớp Java bean từ XML
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="bean-class">
public class <xsl:value-of select="@name"/> {
<xsl:apply-templates select="property" mode="instance-variable"/>
public <xsl:value-of select="name"/> () { }
<xsl:apply-templates select="property" mode="getter-and-setter"/>
}
</xsl:template>
<xsl:template match="property" mode="instance-variable">
private <xsl:value-of select="@type"/> <xsl:text> </xsl:text>
<xsl:value-of select="@name"/>;
</xsl:template>
<xsl:template match="property" mode="getter-and-setter">
<xsl:apply-templates select="." mode="getter"/>
<xsl:apply-templates select="." mode="setter"/>
</xsl:template>
<xsl:template match="property" mode="getter">
public <xsl:value-of select="@type"/>
get_<xsl:value-of select="@name"/>() {
return this.<xsl:value-of select="@name"/>;
}
</xsl:template>
<xsl:template match="property" mode="setter">
public void set_<xsl:value-of select="@name"/>(<xsl:value-of
select="@type"/> value) {
this.<xsl:value-of select="@name"/> = value;
}
</xsl:template>
</xsl:stylesheet>
|
Mẫu đầu tiên phù hợp với các thành phần <bean-class>, xuất ra mã Java
đối với lớp bean như là văn bản, bị đối nghịch với việc xuất ra các thành
phần XML giống như các văn bản XSLT thường làm. Trước tiên, để sinh ra các
biến riêng của lớp, mẫu chuyển các tiểu thành phần <property> sang
mẫu instance-variable (biến - trường hợp) (mẫu
phù hợp với các thành phần "property" trong phương thức instance-variable. Sau đó nó sinh ra một cấu trúc
xây dựng mặc định, và chuyển các thành phần <property> tới mẫu getter-and-setter để sinh ra các phương pháp
getter và setter
của property. Ví dụ 3 thể hiện kết quả việc chuyển mẫu XML thông qua biểu
mẫu này.
Ví dụ 3. Đầu ra của biểu mẫu XSLT để sinh ra các lớp Java bean
public class Employee {
private int id;
private String name;
private String title;
public Employee() { }
public int get_id() {
return this.id;
}
public void set_id (int value) {
this.id = value;
}
public String get_name() {
return this.name;
}
public void set_name (String value) {
this.name = value;
}
public String get_title() {
return this.title;
}
public void set_title (String value) {
this.value = value;
}
}
|
Lớp trên chứng minh việc sử dụng XSLT để xác định một ngôn ngữ mới. Tại đây, biểu mẫu XSLT ngầm xác định một ngôn ngữ mới cho việc xác định các khái niệm lớp Java. Bạn có thể sử dụng một biểu mẫu, như là một ví dụ, trong một hệ thống bản vẽ quan hệ đối tượng, sinh ra các đối tượng Java phù hợp với các bảng cơ sở dữ liệu, khi XML được sinh ra từ các cột cơ sở dữ liệu, hoặc phù hợp với các cấu hình XML cung cấp tới người dùng nơi XML được cung cấp trực tiếp bởi chuyên viên phát triển. Nếu bạn bổ sung ngôn ngữ riêng XML và biểu mẫu XSLT tương ứng, sau đó bạn có thể thêm sự hỗ trợ tới việc xác định chính xác các lớp quan hệ như yếu tố một-tới-một (one-to-one), một-tới-nhiều (one-to-many) và nhiều-tới-nhiều (many-to-many), trong đó trường hợp biểu mẫu sinh ra mã tương đối phức tạp để duy trì danh sách các đối tượng con, và mã để cây đối tượng đọc và lưu trữ từ và tới cơ sở dữ liệu SQL. Một khi bạn xác định được ngôn ngữ nguồn (ngôn ngữ riêng XML được sử dụng để xác định các đối tượng Java), bạn có thể dịch ngôn ngữ XML đó sang mã phức tạp như bạn muốn, trong khi giữ sự thực thi logic đó, cái mà được giấu từ chuyên viên phát triển cuối cùng, người chỉ phải xác định đối tượng hệ thống trên phương diện ngôn ngữ XML cấp cao.
XSLT xác định các ngôn ngữ mới
Khi được xem trong ngữ cảnh này, biểu mẫu XSLT ngầm xác định như một ngôn ngữ, vì một biểu mẫu lấy XML và dịch nó sang một dạng khác, cách tương tự như người soạn thảo Java lấy mã nguồn Java và dịch nó sang một loạt hướng dẫn máy ảo. Hạn chế duy nhất là XSLT được thiết kế để xử lý đầu vào XML, do đó mã nguồn phải được xác định như một ngôn ngữ riêng XML.
Nhìn dưới một cách khác, XSLT có thể được sử dụng để xác định các trình bao bọc XML xung quanh các ngôn ngữ khác và các định dạng đầu ra, các tương tự mà ngôn ngữ Java có thể được xem như một trình bao bọc xung quanh gói hướng dẫn của JVM.
Do XML rất phổ biến và chuẩn mực, và rất nhiều sự hỗ trợ cho nó, xác định một ngôn ngữ như ngôn ngữ riêng XML có nghĩa rằng nó sẵn sàng được hiểu và có thể dễ dàng được tích hợp vào các hệ thống khác (ví dụ, các hệ thống được thiết kế sẵn sàng để sinh ra đầu ra XML). Nó cũng có thể hợp nhất ví dụ như một ngôn ngữ vào một đường đường ống dẫn, dịch dữ liệu XML nguồn sang ngôn ngữ mới, bọc định dạng đầu ra mong muốn. Do có mặt khắp nơi của XML khiến nó là một ứng viên xuất sắc để bọc một định dạng đầu ra như PDF hay PostScrip, làm nó có thể lập trình sinh ra các tài liệu như vậy mà không cần các kiến thức cần thiết về chi tiết của cú pháp ngôn ngữ PDF hay PostScript.
Adobe đã tạo ra sự kết nối hợp lý này với dự án Adobe Mars, trong đó Adobe đã xác định PDFXML, một ngôn ngữ riêng XML mà có thể sử dụng để tạo ra các tài liệu PDF (xem Tài nguyên). Dự án Mars vẫn đang được phát triển, và sự hỗ trợ tối thiểu với các công cụ và tài liệu hướng dẫn. Các tài liệu Mars cũng yêu cầu một trình bổ sung đặc biệt để xem, trái ngược với các tài liệu đang được xem bởi các chương trình xem PDF hiện tại. Nó giới thiệu một nền tảng hoàn toàn mới để tạo ra các tài liệu di động, và, như vậy, không tương thích với các trình xem PDF hiện tại.
Một cách tiếp cận khác tới một định dạng tài liệu dựa trên XML là xác định một ngôn ngữ riêng XML mà có thể được dịch sang một định dạng đang tồn tại như PDF sử dụng một biểu mẫu XSLT hoặc một loạt các biểu mẫu để thực thi việc dịch này.
Người ta có thể xác định một biểu mẫu XSLT mà dịch trực tiếp các cấu trúc XML sang mã PDF, có thể sử dụng mã của dự án Java iText như một hướng dẫn đối với biểu mẫu hợp lý.
Như một ví dụ đơn giản hơn, một cách tiếp cận trung gian dịch từ XML sang PostScript, và sau đó sử dụng một chương trình chuyển đổi PostScript-to-PDF mã mở để tiến hành bước cuối cùng việc soạn thảo sang định dạng PDF (xemTài nguyênđể có đường dẫn tới các công cụ của mã mở PostScript-to-PDF). Kết quả cuối cùng là bạn có thể tạo ra các tài liệu PDF sử dụng XML một cách lập trình.
Một ví dụ đơn giản hơn: tạo ra PostScript từ XML
Đối với ví dụ đơn giản hơn này để tạo ra PostScript, nơi bạn có thể tạo ra
định dạng PDF sử dụng một công cụ theo yêu cầu sử dụng mã mở, câu hỏi đầu
tiên là cần bao nhiêu XSLT để sử dụng. PostScript là một ngôn ngữ lập
trình mà bạn đặt các toán hạng vào một ngăn xếp, sau đó ứng dụng một chức
năng tới chúng — một quy ước gọi là cú pháp postfix,
trong đó tên chức năng được xác định sau sự lập luận. Do câu lệnh
PostScript để nhân 3 và 7 là 3 7 mul. Có nghĩa
rằng "đặt 3 lên ngăn xếp, sau đó đặt 7 lên ngăn xếp, sau đó gọi tính năng
mul". Tính năng mul, khi được yêu cầu, bật ra hai khoản mục trong ngăn xếp và
nhân chúng, sau đó đưa kết quả lên ngăn xếp. Do đó lệnh PostScript 3 7 mul 2 add tương đương với biểu thức toán học
(3 * 7) + 2. Chức năng mul nhân 3 và 7, đặt 21 lên ngăn xếp, sau đó số 2 được đẩy lên
ngăn xếp, sau đó chức năng cộng được yêu cầu,
đưa hai số lên ngăn xếp và cộng chúng, đặt 23 lên ngăn xếp.
PostScript sinh ra các trang văn bản và đồ hoạ có thể in được và hoàn trả. Bạn đặt các đối tượng văn bản và đồ hoạ vào trang với ngữ cảnh hậu tố tương tự với ví dụ về phép tính nhân và cộng phía trên. Hệ thống kết hợp của PostScript đặt số gốc (0,0) tại góc phía dưới bên trái của trang, và chứa 72 điểm mỗi inch. Do đó, sự kết hợp (72,72) đại diện số điểm trên mỗi inch của góc bên trái, phía dưới của trang. Ví dụ, Ví dụ 4 diễn tả PostScript trong việc thể hiện một hình tròn.
Ví dụ 4. PostScript thể hiện một hình tròn
150 150 10 0 360 arc |
Nó vẽ một cung tròn tại điểm (150, 150) trên bản vẽ (tương ứng với góc dưới
bên trái), bán kính 10, từ góc 0 tới góc 360, hoặc cả một vòng tròn. Giống
như phép nhân, các toán hạng được đẩy lần lượt lên ngăn xếp, sau đó chức
năng arc (hình cung) được yêu cầu, đưa 5 phép
tính lên ngăn xếp và sử dụng chúng để diễn tả một vòng tròn.
Với sự hướng dẫn PostScript này, bạn có thể tạo ra một trang điểm dữ liệu trong một vùng phân tán. Ví dụ 5 thể hiện một biểu mẫu XSLT để làm việc này.
Ví dụ 5. Biểu mẫu XSLT tạo ra một vùng phân tán PostScript
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<apply-templates select="//point"/>
showpage
</xsl:template>
<xsl:template match="point">
<xsl:value-of select="x"/> <xsl:text> </xsl:text>
<xsl:value-of select="y"/> 5 0 360 arc
fill
</xsl:template>
</xsl:stylesheet>
|
Biểu mẫu này đưa một tài liệu XML chứa các thành phần <point> của
biểu mẫu <point x="30" y="50"/> và tạo một tài liệu PostScript, phân
bố chúng trên trang theo các điểm có bán kính 5, phản hồi một tập hợp các
điểm dữ liệu XML vào một vùng phân bố trực quan. Lưu ý yêu cầu tới showpage tại cuối của biểu mẫu mức cao nhất, thể
hiện showpage như là một trang có thể in được
những gì đã được vẽ từ trước đến nay.
Vùng phân bố giải thích ứng dụng đơn giản nhất của khái niệm này — sử dụng XSLT để tạo ra PostScript — vì nó lấy các thành phần XML và dịch chúng trực tiếp sang một câu lệnh PostScript. Trong trường hợp này, thành phần XML đã chứa thông tin kết hợp trong nó. Mọi thứ trở nên phức tạp do các thông tin kết hợp đó biến mất trong dữ liệu (ví như khi dữ liệu XML có ít mối quan hệ với đồ hoạ đầy đủ PostScript). Ví dụ, chuyển một bước phía trên vùng phân bổ, hoàn trả một đường đồ hoạ từ tập hợp giá trị dữ liệu XML đại diện cho giá trị cột y yêu cầu rằng XSLT tính toán giá trị cột x như trong Ví dụ 6.
Ví dụ 6. XSLT dịch một tập hợp các thành phần <temperature> sang dòng đồ hoạ PostScript
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:variable name="originY" select="100"/>
<xsl:variable name="originX" select="100"/>
<xsl:variable name="graphWidth" select="1000"/>
<xsl:variable name="graphHeight" select="1000"/>
<xsl:variable name="xDelta" select="$graphWidth / div count(//temperature)"/>
<xsl:variable name="tempRange" select="200"/>
<xsl:template match="/">
<xsl:apply-templates select="//temperature"/>
stroke
showpage
</xsl:template>
<xsl:template match="temperature">
<xsl:value-of select="ceiling($="$originX + (position() * $xDelta)"/>
<xsl:text> </xsl:text>
<xsl:value-of select="ceiling($originY + (@temp div / $tempRange *
$graphHeight))"/>
<xsl:if test="position() = 1">
moveto
<xsl:if>
<xsl:if test="position() != 1">
lineto
</xsl:else>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
|
Biểu mẫu này lấy một tài liệu chứa các thành phần <temperature> của
biểu mẫu <temperature temp="30"/>, và dịch chúng một ngăn xếp
PostScript, hoàn trả một đường đồ hoạ của các mức nhiệt độ này. Biểu mẫu
sử dụng hàm toán học XPath count() và position() để tính giá trị cột x của các điểm
trên đường đồ hoạ. Do các điểm phải được phân bổ đều dọc theo trang, biểu
mẫu trước hết tính toán các điểm sẽ xa bao nhiêu bằng cách chia giá trị
pageWidth cho số các thành phần <temperature> trong tài
liệu. Biến xDelta lưu trữ kết quả, đại diện cho số phần tử ảnh giữa
mỗi điểm nhiệt độ.
Nhiệt độ ở mức gốc (root-level) hoạt động tương
tự như trong ví dụ phân bố các điểm, hoàn trả hướng dẫn đối với các thành
phần <temperature> và sau đó yêu cầu showpage để hoàn trả nội dung của bộ nhớ đồ hoạ trung gian.
Biểu mẫu temperature (nhiệt độ) tính giá trị
toạ độ x bằng cách nhân giá trị xDelta với giá trị được phản hồi
bởi hàm toán học XPath position() (nơi phản hồi
chỉ số của nốt hiện tại trong tập hợp các nốt được lựa chọn được chuyển
đến biểu mẫu). Nó cũng thêm giá trị của originX, cái mà chỉ định
giá trị toạ độ x (x-coordinate) của điểm lệch về bên trái trong đồ hoạ. Nó
xuất ra giá trị này (đẩy nó lên ngăn xếp PostScript trong chương trình đầu
ra), và sau đó xuất ra giá trị y, nơi là các thành phần nhiệt độ như chiều
cao của đồ thị, $originY + (@temp / $tempRange *
$graphHeight). $originY chắc chắn điểm thấp nhất không
thấp hơn đáy của đồ thị, và @temp / $tempRange *
$graphHeight thấy rằng tỷ lệ của nhiệt độ so với dải nhiệt độ,
và nhân với chiều cao của đồ thị, tạo ra giá trị y tương ứng của nhiệt độ
và được chứa trong chiều cao của đồ thị.
Hoàn trả một trang các đường thẳng trong PostScript sử dụng XSLT
Đồ thị đường thẳng giới thiệu một số lập luận hoàn trả tới XSLT, vì nguồn tài liệu XML không bao gồm tất cả thông tin kết hợp trong các đồ thị được hoàn trả; biểu mẫu phải tính toán giá trị x và y của mỗi đường trong đồ thị từ giá trị nhiệt độ được cung cấp. Vấn đề tương tự xảy ra khi hoàn trả một trang văn bản sau. Ví dụ, nếu bạn có một tài liệu XML của các thành phần <line> của mẫu <line height="15">hello there</line>, bạn có thể hoàn trả chúng vào trang trong biểu mẫu trong Ví dụ 7.
Ví dụ 7. XSLT dịch các thành phần <line> sang PostScript
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:variable name="pageHeight" select="720"/>
<xsl:template match="/">
<xsl:apply-templates select="//line[1]">
<xsl:with-param name="y" select="0"/>
</xsl:apply-templates>
showpage
</xsl:template>
<xsl:template match="line">
<xsl:param name="y"/>
/Helvetica findfont <xsl:value-of select="@height"/> scalefont setfont
0 <xsl:value-of select="$pageHeight - $y"/> moveto
(<xsl:value-of select="text()") show
<xsl:apply-templates select="following-sibling::line[1]">
<xsl:with-param name="y" select="$y + @height"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
|
Biểu mẫu này thể hiện rất nhiều điều. Kết quả cuối cùng là lấy một tập hợp của các thành phần <line>, của mẫu <line height="20">some text</line>, và tạo ra các câu lệnh PostScript mà hoàn trả các dòng sau khi các dòng khác rơi xuống trang, cho phép các dòng thay đổi cỡ chữ với các biến height, xác định chiều cao của văn bản.
Biểu mẫu này giải quyết vấn đề lớn nhất để làm sao duy trì giá trị toạ độ y
cho dòng văn bản tiếp theo, giá trị mà tăng bởi một giá trị khác tiềm năng
đối với mỗi dòng được thêm vào trang. Đây là một vấn đề khác để giải quyết
hơn là dòng đồ thị, nơi tất cả các điểm giá trị bằng nhau về khoảng cách
và do đó có thể dễ dàng định vị sử dụng một công thức khai báo. Trong
trường hợp này, khoảng cách giữa các thành phần liền kề có thể khác phụ
thuộc vào dữ liệu trong mỗi thành phần, và một giá trị y cộng dồn phải
được duy trì như các biểu mẫu dịch chuyển qua các dòng của dữ liệu trong
tài liệu nguồn. Một biểu mẫu đệ quy (recursive) lấy một tham số giải quyết
vấn đề này. Một thành phần <xsl:param> xác định một lập luận bạn có
thể chuyển tới một biểu mẫu khi bạn yêu cầu nó, thêm nhiều sức mạnh cho
XSLT. Trong trường hợp này, nó để cho bạn duy trì giá trị toạ độ y, chuyển
giá trị y được cập nhật tới yêu cầu đệ quy kế tiếp của biểu mẫu dòng.
Biểu mẫu dòng chấp nhận một tham số y, có nghĩa rằng khi bạn yêu cầu biểu mẫu dòng bạn chuyển một giá trị cho tham số này tới
nó, tương tự như chuyển một lập luận tới một yêu cầu chức năng (function
call). Nhiệt độ tập hợp các cỡ chữ cho dòng văn bản (và, do đó, chiều cao
của dòng) sử dụng đặc tính chiều cao của thành
phần <line>. Dòng tiếp theo của biểu mẫu di chuyển các con trỏ đồ
hoạ PostScript tới một x của 0 (lề bên trái của trang), và một giá trị y
của $pageHeight - $y, vì một giá trị y
PostScript là tương ứng với một giá trị gốc tại góc dưới bên trái của
trang, trong khi các thành phần <line> trong dữ liệu được sắp xếp từ
cao tới thấp. Giá trị $y ở đây là tham số y của nhiệt độ. Sau đó nhiệt độ hiển thị văn bản của thành
phần <line> sử dụng PostScript thể hiện
câu lệnh; một chuỗi văn bản PostScript được chứa trong dấu ngoặc đơn.
Mệnh đề cuối cùng của biểu mẫu kiểm soát sự đệ quy, yêu cầu biểu mẫu tương
tự với dữ liệu kế tiếp sinh ra đồng thời của thành phần <line> hiện
tại, chuyển vào một giá trị y được cập nhật với chiều cao của dòng này, để
định vị dòng tiếp theo của thư mục văn bản dưới nó. Lưu ý rằng biểu mẫu ở
mức gốc cũng yêu cầu biểu mẫu này với một giá trị tham số y của 0 để bắt đầu dòng quay lại của trang.
Dịch chuyển lập luận hoàn trả từ XSLT sang PostScript
Biểu mẫu đồ thị bao gồm một số hợp lý các tính toán, và biểu mẫu hoàn lại các dòng văn bản cũng bao gồm một số hợp lý các lập luận để tính toán toạ độ y. Do các biểu mẫu này là các trình soạn thảo thực sự, việc dịch dữ liệu XML sang một ngôn ngữ lập trình có quy trình (là PostScript), là một cách khác để đưa tất cả lập luận hoàn trả vào XSLT, để hoàn trả lập luận trong PostScript được tạo ra, và để PostScript thực hiện các tính toán hoàn trả tại thời gian chạy chứ không phải thực thi tại thời gian soạn thảo. Đây là một sự lựa chọn mà luôn luôn hiện ra khi bạn soạn thảo từ một ngôn ngữ lập trình sang ngôn ngữ khác: công việc phải làm trong trình soạn thảo nhiều thế nào, và phải để lại cho ngôn ngữ được tạo ra tại thời gian chạy bao nhiêu. Thông thường bạn muốn làm nhiều nhất công việc có thể tại thời gian soạn thảo sự hoạt động. Do PostScript được thiết kế để làm nó dễ dàng hoàn trả các trang đồ thị và văn bản hơn, và XSLT được thiết kế để thực thi dịch dữ liệu XML sang định dạng khác, nó đơn giản hoá mọi thứ để tạo mỗi ngôn ngữ làm những gì tốt nhất, và dịch chuyển lập luận hoàn trả ra khỏi và tới PostScript được tạo ra.
Ví dụ, một cách khác của biểu mẫu hoàn trả văn bản của Ví dụ 7 , cái mà duy trì giá trị toạ độ y trong XSLT, là Ví dụ 8, thực hiện điều đó trong PostScript được tạo ra.
Ví dụ 8. Biểu mẫu XSLT khác để hoàn trả các dòng văn bản của trang, dịch chuyển các tính toán hoàn trả sang thời gian chạy PostScript
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template match="/">
/y 72 11 mul def
/text_line
{
/height exch def
/text exch def
/y pop def
/Helvetica findfont height scalefont setfont
/y y height sub def
0 y moveto
text show
}
bind def
<xsl:apply-templates select="//line"/>
showpage
</xsl:template>
<xsl:template match="line">
(<xsl:value-of select="text()"/>) <xsl:value-of
select="@height"/> text_line
</xsl:template>
</xsl:stylesheet>
|
Biểu mẫu mức gốc (root-level) xác định một biến
PostScript gọi là /y, tập hợp chiều cao của trang trong các điểm
(72 mỗi inch), và xác định một hàm chức năng gọi là text_line. /text_line đề cập tới
một mục vào (entry) trong từ điển tra cứu PostScript, các nội dung trong
dấu ngoặc móc ({}) chứa định nghĩa hàm chức năng để kết nối tới mục vào
đó, và kết nối định nghĩa (def) tại kết nối
cuối cùng tên mục vào text_line tới định nghĩa
hàm chức năng đó.
text-line tập hợp các biến cục bộ tới các biến
trên ngăn xếp — giá trị văn bản và chiều cao
— có nghĩa rằng bạn yêu cầu text_line trong định dạng text height
text_line (chiều cao văn bản, dòng văn bản) (ví dụ, (hello there) 20 text_line để định vị dòng "hello
there" với chiều cao 20 tại giá trị hiện tại của y). text_line tập hợp phông chữ, sử dụng giá trị
chiều cao được cung cấp như khoảng giá trị đối với phông chữ. Sau đó nó di
chuyển các con trỏ đồ thị tới toạ độ x 0 (cạnh bên trái) và toạ độ y, và
thể hiện chuỗi văn bản đã cho. Sau đó nó thêm chiều cao đã cho và giá trị
y đã có và tập hợp toàn bộ biến /y để tính tổng, chạy liên tục bộ
đếm ngược y tới trang như text_line.
Để kết thúc, biểu mẫu ở mức gốc (root-level template) đẩy 0 lên ngăn xếp
như khởi đầu giá trị y, yêu cầu mẫu dòng với
tất cả thành phần <line> trong tài liệu nguồn. Do tất cả lập luận
hiện tại đang trong hàm PostScript text_line,
bản thân mẫu dòng là không quan
trọng— mỗi thành phần <line> dịch trực tiếp sang
một yêu cầu tới hàm chức năng PostScript text_line.
Với việc PostScript quản lý tất cả lập luận hoàn trả, biểu mẫu dễ dàng để xác định một ngôn ngữ phong phú hơn, ví dụ toàn XHTML, cho phép bạn xác định các tài liệu các tài liệu như XHTML và soạn thảo chúng vào tài liệu PostScript (cái mà sẵn sàng được chuyển sang PDF).
Khi phát triển một biểu mẫu dành cho một ngôn ngữ giống như XHTML, bạn lại
có một cơ hội về việc mỗi mẫu biểu của bạn hiểu thế nào về
PostScript, có nghĩa rằng mỗi lập luận PostScript gồm có sự hoàn trả chính
nó. Một giải pháp là tạo các mẫu cho các thẻ XHTML giống như <h1_>,
<h2>, <h3> và <div>, mỗi đầu ra câu lệnh PostScript,
giống các yêu cầu tới text_line, hoàn trả chính nó. Giải pháp này kết hợp
chặt chẽ ngôn ngữ được xác định trong biểu mẫu (XHTML) với ngôn ngữ của
PostScript. Như một sự lựa chọn khác, bạn có thể xác định các hàm chức
năng như /h1, /h2/,
/h3 và /div
trong PostScript được hoàn trả, dịch mỗi thẻ XHTML vào một yêu cầu tới hàm
chức năng tương ứng của nó, cách tương tự mã trong Ví dụ
8 dịch các thẻ <line> trực tiếp sang các yêu cầu tới hàm
chức năng PostScript text_line. Trong trường
hợp này, mẫu biểu XSLT thực sự xác định một ngôn ngữ bao bọc XML xung
quanh ngôn ngữ bạn vừa xác định trong PostScript trên phương diện các hàm
chức năng hiện có, và PostScript được tạo ra được kết hợp chặt chẽ với
khái niệm của XHTML. Trong cả hai trường hợp — đưa nhiều
kiến thức PostScript vào các thẻ XHTML, hoặc nhiều kiến thức XHTML trong
các hàm chức năng PostScript (bằng cách tạo ra một hàm chức năng
PostScript cho tất cả thẻ XHTML) — giải pháp bao gồm hai sự
lưu ý mà nên được tách riêng biệt. Lưu ý thứ nhất là vấn đề của sự hoàn
trả một trang văn bản, vấn đề này được kiểm soát tốt hơn bởi ngôn ngữ
trang hoàn trả PostScript, và lưu ý thứ hai là vấn đề việc xác định ngôn
ngữ XHTML, một vấn đề được kiểm soát tốt hơn bởi XSLT, cái mà xác định
ngôn ngữ riêng XML.
Tóm lại, bạn có chỗ cho một lớp trừu tượng khác tại đây, được thực thi như
hai biểu mẫu XSLT áp dụng theo trình tự. Biểu mẫu đầu tiên xác định các
mẫu cho ngôn ngữ XHTML, nhưng thay vì dịch chúng sang các câu lệnh
PostScript hoặc các yêu cầu hàm chức năng PostScript, nó dịch chúng sang
một ngôn ngữ riêng XML trung gian bởi biểu mẫu thứ hai. Biểu mẫu thứ hai
xác định một ngôn ngữ trung gian giữa XHTML và PostScript, tạo ra các thẻ
cần thiết để xác định một trang các thành phần sau. Biểu mẫu thứ hai dịch
các thẻ này sang một tập hợp trọng tâm của các hàm chức năng PostScript
cần thiết để hoàn trả một trang văn bản sau. Tập hợp trọng tâm các hàm
chức năng bao gồm các hành vi giống như quản lý các giá trị con trỏ x và
y, gói bao bọc từ ngữ, đánh số trang, và hoàn trả các thành phần văn
bản. Ví dụ 8, dịch các thành phần <line> sang
các yêu cầu tới các hàm chức năng PostScript text_line, là một ví dụ của biểu mẫu trung gian thứ hai trên;
nó xác định một thành phần bao bọc, <line>, xung quanh một hàm chức
năng PostScript text_line. Biểu mẫu đầu tiên
xác định các mẫu cho tất cả các thẻ XHTML, mỗi mẫu xuất ra các thẻ được
xác định trong biểu mẫu thứ hai, giống như <line>. Ví dụ, Ví dụ 9
thể hiện một tập hợp con của biểu mẫu XHTML.
Ví dụ 9. Biểu mẫu XSLT dịch một tập hợp con của XHTML sang một ngôn ngữ riêng XML trung gian
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:param name="h1_height"/>
<xsl:param name="h2_height"/>
<xsl:template match="/">
<lines>
<xsl:apply-templates/>
</lines>
</xsl:template>
<xsl:template match="//h1">
<line height="$h1_height"><xsl:value-of select="text()"/></line>
</xsl:template>
<xsl:template match="//h2">
<line height="$h2_height"><xsl:value-of select="text()"/></line>
</xsl:template>
</xsl:stylesheet>
|
Biểu mẫu này xác định một tập hợp con nhỏ của XHTML, dịch nó sang ngôn ngữ
riêng XML hoàn trả trang trung gian của biểu mẫu thứ hai, một ngôn ngữ
"flowing text" (dàn văn bản). Biểu mẫu trong Ví dụ 9 lấy
hai tham số, h1_height và h2_height, để trình yêu cầu xác định cỡ chữ của thẻ <h1>
và <h2>. Ví dụ, trình yêu cầu có thể phân tích một biểu mẫu CSS và
chuyển các giá trị như h1_height và h2_height dựa trên các kiểu dáng được
xác định. Biểu mẫu //h1//h2 dịch các thẻ chỉ định XHTML <h1> và <h2> sang
thẻ loại <line>, cái mà chỉ xác định một dòng văn bản với một chiều
cao cụ thể.
Nguyên tắc chia tách này, khuyến khích việc sử dụng bắt đầu bằng hai biểu mẫu, cho phép tái sử dụng của một trong hai biểu mẫu, ví dụ để dịch XHTML sang một vài định dạng khác như RTF, hoặc để dịch một vài định dạng khác như RTF sang ngôn ngữ riêng "flowing page" (dàn trang) trung gian được xác định trong biểu mẫu thứ hai, có lẽ để hoàn trả các tài liệu RTF như PostScript. Khi bạn giữ lập luận hoàn trả trong chính PostScript, biểu mẫu XSLT có thể tự do xác định nguồn ngôn ngữ riêng XML, và chia tách các vai trò của chức năng đích (lập luận hoàn trả PostScript), và khái niệm ngôn ngữ (biểu mẫu XSLT).
XSLT ít khi được thấy như là một trình soạn thảo ngôn ngữ, nhưng trong việc xác định dịch một cấu trúc dữ liệu sang một cấu trúc khác, đó chính là những gì của XSLT. Như một trình soạn thảo, một biểu mẫu XSLT ngầm xác định ngôn ngữ của tài liệu gốc. Do đó, bạn có thể sử dụng nó để kết nối các ngôn ngữ như XHTML với các ngôn ngữ không liên quan giống như PostScript, hoặc XML và Java, để hoàn trả các ngôn ngữ sang các định dạng khác bằng cách dịch lần lượt sang ngôn ngữ đích.
Học tập
-
PostScript trên
Wikipedia: Nắm được nguồn gốc phía sau ngôn ngữ mô tả này thường được sử
dụng trong chế bản điện tử và chế bản văn phòng.
-
Adobe PostScript
3: Xem trang chủ của công nghệ hình ảnh và in ấn này.
-
PostScript
Language Reference: Đọc về ngôn ngữ lập trình trình diễn được sử
dụng để miêu tả sự xuất hiện của văn bản, hình dáng đồ thị, và các hình
ảnh mẫu trên các trang được in ra và hiển thị.
-
Adobe Mars Project:
Tìm hiểu về sự đại diện thân thiện của XML đối với các tài liệu PDF gọi là
PDFXML.
-
XSLT 2.0 recommendation, do
World Wide Web (W3C) Consortium duy trì: Đọc thêm về cú pháp và ngữ nghĩa
của XSLT 2.0, một ngôn ngữ biến đổi các tài liệu XML sang các tài liệu XML
khác.
-
What kind of language is XSLT? (Michael Kay, developerWorks,
February 2001, updated April 2005): Thể loại ngôn ngữ nào là XSLT, nó để
làm gì, và tại sao nó được thiết kế theo cách đó? Tìm các câu trả lời cho
các câu hỏi này.
-
An XSLT
style sheet and an XML dictionary approach to internationalization
(Laura Menke, developerWorks, April 2001): Một ví dụ về việc XSLT có thể
hữu ích như thế nào trong các vấn đề của thế giới thực tại.
-
How an XSLT processor works (Benoit Marchal, developerWorks,
March 2004): Học thêm về lý thuyết đằng sau XSLT và bản chất đệ quy của mã
hoá cho việc lập trình nhanh hơn trong XSLT.
-
Create multiple files in XSLT 2.0 (Jack Herrington,
developerWorks, March 2005): Khám phá các ví dụ của tài liệu kết quả XSLT
khi thực hiện các lời khuyên trong developerWorks này.
-
XSLT: Working with XML and HTML (Khun Yee Fung, Addison-Wesley,
December 2000): Khám phá một tham khảo toàn diện và bài viết tới
XSLT.
-
XSLT
Functions: Đọc thêm tham khảo rộng hơn từ trang web w3school.com.
-
IBM XML
certification: Tìm hiểu xem làm như thế nào bạn có thể trở thành
Chuyên viên được chứng nhận của IBM về XML và các công nghệ liên
quan.
-
XML technical library: Xem developerWorks XML Zone để có rất
nhiều bài viết về kỹ thuật và lời khuyên, các bài hướng dẫn, và sách đỏ
của IBM.
-
developerWorks technical events and webcasts: Đọc tiếp về công
nghệ trong các phần này.
- The technology bookstore: Tìm kiếm các sách tại đây và các chủ đề kỹ
thuật khác.
-
developerWorks podcasts: Nghe các bài phỏng vấn thú vị và các
cuộc thảo luận về các chuyên viên phát triển phần mềm.
Lấy sản phẩm và công nghệ
-
ps2pdf: Xem
công cụ chuyển đổi PostScript-to-PDF hoạt động thế nào.
-
Preview:
Thử ứng dụng Mac OS X này để hiển thị các hình ảnh và các tài liệu
PDF.
-
IBM trial software for product evaluation: Xây dựng dự án tiếp
theo của bạn với phần mềm dùng thử có thể tải trực tiếp từ developerWorks,
bao gồm các công cụ phát triển ứng dụng và sản phẩm phần mềm trung gian từ
DB2®, Lotus®, Rational®,
Tivoli®, và WebSphere®.
Thảo luận
-
XML zone discussion forums: Tham gia và bất cứ diễn đàn trọng tâm
XML nào tại đây.
-
XML zone discussion forums: Tham gia vào bất cứ cuộc thảo luận
liên quan đến XML tại đây.
-
developerWorks blogs: Kiểm tra các blogs này và tham gia vào cộng
đồng developerWorks.

Jake Miles là một nhà phát triển có thâm niên cao tại Conde Nast, hiện đang làm việc với các ứng dụng Facebook, Myspace và OpenSocial, sử dụng Java, PHP, Adobe Flex và Javascript. Ông đã làm việc như một nhà phát triển chuyên nghiệp suốt 10 năm qua và đã từng là một học sinh khao khát và ham mày mò từ khi lên 10. Ông cũng dạy trên tinh thần tình nguyện và tin rằng bất cứ ai cũng có thể học bất cứ điều gì nếu được dạy đủ rõ ràng