Chuyển đến nôi dung chính

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng (tiếng Anh).

Khi bạn đăng nhập lần đầu tiên, một bản trích ngang trên developerWorks sẽ được tạo ra. Chọn các thông tin trong trích ngang của developerWorks để hiển thị công khai, bạn có thể sửa lại thông tin này bất cứ lúc nào. Tên, họ và tên hiển thị sẽ đi kèm với nội dung mà bạn gửi lên.

Thông tin gửi đi được đảm bảo an toàn.

  • Đóng [x]

Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng (tiếng Anh).

Thông tin gửi đi được đảm bảo an toàn.

  • Đóng [x]

XSLT giống như một trình soạn thảo ngôn ngữ

Sử dụng XSLT để tạo ra PostScript từ XML

Jake Miles, Tác giả tự do, 软通动力信息技术有限公司
Author photo
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

Tóm tắt:  Tìm hiểu khái niệm XSLT như là một trình soạn thảo ngôn ngữ lập trình, đặc biệt khi bạn tạo một mã ngoài XML phía trước PostScript®, để tạo ra các tệp PostScript từ các văn bản XML. Bài viết này giới thiệu khái niệm một biểu mẫu như là một khái niệm ngôn ngữ ngầm định, nền tảng của PostScript, và các lớp của sự trừu tượng tham gia trong khi tạo ra một trình soạn thảo XML-to-PostScript.

Ngày:  17 07 2009
Mức độ:  Trung bình Cũng sẵn có bằng  tiếng Anh PDF:  A4 và Thư (355KB | 11 pages)Tải Adobe® Reader®
Hoạt động:  3242 lần đọc
Góp ý kiến:  


XSLT giống như một trình soạn thảo

Các từ viết tắt được sử dụng thường xuyên

  • CSS: Cascading Stylesheet (Biểu mẫu nhiều tầng)
  • JVM: Java Virtual Machine (Bộ máy ảo Java)
  • PDF: Portable Document Format (Định dạng tài liệu dễ di chuyển)
  • RTF: Rich Text Format (Định dạng Rich Text)
  • XHTML: Extensible Hypertext Markup Language (Ngôn ngữ đánh dấu siêu văn bản mở rộng)
  • XML: Extensible Markup Language (Ngôn ngữ đánh dấu mở rộng)
  • XSLT: Extensible Stylesheet Language Transformation (Chuyển đổi ngôn ngữ biểu mẫu mở rộng)

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 gettersetter để 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 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.


Tạo ra Adobe PDF từ XML

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.


Thêm lập luận hoàn trả đồ hoạ

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()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).


Các lớp trừu tượng

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/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_heighth2_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).


Kết luận

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.


Tài nguyên

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

Đôi nét về tác giả

Author photo

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

Hướng dẫn về "Phản ánh nội dung không thích hợp

Phản ánh về nội dung không thích hợp

Cám ơn. Nhận xét này sẽ được báo cho người chủ mục tin.


Hướng dẫn về "Phản ánh nội dung không thích hợp

Phản ánh về nội dung không thích hợp

Gửi phản ánh bị lỗi. Làm ơn thử lại sau.


developerWorks: Đăng nhập

Nếu bạn chưa có định danh (ID) và mật khẩu của IBM, đăng ký tại đây.


Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu


Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng (tiếng Anh).

 


Khi bạn đăng nhập lần đầu tiên, một bản trích ngang trên developerWorks sẽ được tạo ra. Chọn các thông tin trong trích ngang của developerWorks để hiển thị công khai, bạn có thể sửa lại thông tin này bất cứ lúc nào. Tên, họ và tên hiển thị sẽ đi kèm với nội dung mà bạn gửi lên.

Choose your display name

Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

(Độ dài phải từ 3 đến 31 ký tự)


Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng (tiếng Anh).

 


Chấm điểm bài này

Bình luận

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=413536
ArticleTitle=XSLT giống như một trình soạn thảo ngôn ngữ
publish-date=07172009
author1-email=jacob.miles@gmail.com
author1-email-cc=