XML với Dữ liệu: Có gì mới trong XPath 2.0?

Cái nhìn ban đầu về một số các tính năng đã dự kiến cho XPath 2.0

Kevin Williams nghiên cứu kỹ trạng thái mới nhất của các đặc tả XPath 2.0 và đưa ra một số ví dụ cụ thể về các tính năng XPath 2.0 sẽ giúp cho các nhà phát triển XML thực hiện dễ dàng hơn. Các ví dụ được cung cấp theo XML và XPath.

Kevin Williams, Trưởng ban công nghệ, Equient (a division of Veridian)

Kevin Williams là Trưởng ban công nghệ (CTO) của Blue Oxide Technologies, LLC, một công ty thiết kế XML và phần mềm thiết kế dịch vụ Web XML. Truy cập trang web của công ty tại http://www.blueoxide.com. Có thể liên hệ với Ông tại địa chỉ kevin@blueoxide.com.



30 11 2011

XSLT 1.0 và XPath 1.0 ban đầu được dự định để cung cấp sự hỗ trợ ngôn ngữ định kiểu đơn giản cho các tài liệu XML, chủ yếu là để chuyển đổi các tài liệu đó thành HTML để hiển thị trong một trình duyệt. Tuy nhiên, do XSLT và XPath đã trở nên có sẵn, nên chúng đã được ấn vào trong tất cả các loại nhiệm vụ mà ban đầu chúng không được thiết kế để thực hiện -- từ thao tác dữ liệu phức tạp trong các tài liệu XML (tập hợp, lựa chọn riêng biệt, xoay quanh mối quan hệ) đến chuyển đổi của XSLT từ một biểu mẫu XML thành biểu mẫu khác. Trong phiên bản 2.0 của các đặc tả này, W3C cố gắng làm cho XSLT và XPath trở nên linh hoạt và mạnh mẽ hơn để xử lý phương pháp mới mà các công nghệ này đang được sử dụng.

Trong cột báo trước, tôi đã xem xét một số tính năng mới của XSLT. Trong cột báo này, tôi sẽ xem xét kỹ hơn một vài điểm nổi bật của XPath 2.0 -- có đề cập đến nhiều hơn trong một cột báo duy nhất.

Với mục đích của cột báo này, các tiền tố đã biết ánh xạ như sau:

  • Tiền tố xf: được cho là ánh xạ tới vùng tên của các hàm XPath 2.0 (http://www.w3.org/2002/08/xquery-functions).
  • Tiền tố xsl: ánh xạ tới vùng tên XSLT 2.0.
  • Tiền tố xs: ánh xạ tới vùng tên XML Schema.

Hàm xf:distinct-values

Một trong những thách thức đáng kể nhất đối mặt với các nhà phát triển khi làm việc với các bảng định kiểu XSLT 1.0 là viết XML tương đương của một SELECT DISTINCT trong SQL -- có nghĩa là, một biểu thức lấy một tập nút và trả về một danh sách các giá trị duy nhất từ các nút đó. Điều này là không thể có được trong XSLT 1.0 còn XPath 1.0 thì vô cùng khó khăn. Về cơ bản, bạn đã phải viết một câu lệnh xsl:for-each để đánh giá mỗi nút theo một thứ tự sắp xếp cụ thể, và sau đó bắt buộc nhìn lại danh sách nút để xem liệu có bất kỳ các nút khác nào đã khớp với một nút cụ thể đang được xử lý không. Với XSLT 2.0 và việc đưa vào hàm xf:distinct-values, vấn đề này biến mất. Dưới đây là một ví dụ ngắn về tài liệu XML trong Liệt kê 1:

Liệt kê 1. Các cuốn sách có các tên tác giả
<books>
  <book author="Kevin Williams" title="Professional XML 2.0" />
  <book author="Lewis Carroll" title="Alice in Wonderland" />
  <book author="Lewis Carroll" title="Through the Looking-Glass" />
</books>

Giả sử bạn muốn bình thường hóa bằng thông tin tác giả và tạo ra một tài liệu trông giống như Liệt kê 2:

Liệt kê 2. Các tác giả với các tên sách
<authors>
  <author name="Kevin Williams">
    <book title="Professional XML 2.0" />
  </author>
  <author name="Lewis Carroll">
    <book title="Alice in Wonderland" />
    <book title="Through the Looking-Glass" />
  </author>
</authors>

Để thực hiện điều này, bạn cần phải làm giống như Liệt kê 3 trong XPath và XSLT 1.0:

Liệt kê 3. SELECT DISTINCT trong XPath 1.0
<xsl:template match="books">
  <authors>
    <xsl:for-each select="book">
      <xsl:sort select="@author" />
      <xsl:variable name="thisAuthor">
        <xsl:value-of select="@author" />
      </xsl:variable>
      <xsl:if test="count(preceding-sibling::book)=0">
        <author name="{$thisAuthor}">
          <xsl:for-each select="../book[@author=$thisAuthor]">
            <book title="{@title}" />
          </xsl:for-each>
        </author>
      </xsl:if>
      <xsl:if test="preceding-sibling::book[1]/@author != $thisAuthor">
        <author name="{$thisAuthor}">
          <xsl:for-each select="../book[@author=$thisAuthor]">
            <book title="{@title}" />
          </xsl:for-each>
        </author>
      </xsl:if>
      </xsl:for-each>
    </authors>
</xsl:template>

Có đôi chút lộn xộn và khó khăn với tài liệu, tuy nhiên khi sử dụng hàm xf:distinct, điều này trở nên dễ dàng, như được hiển thị trong Liệt kê 4:

Liệt kê 4. Hàm xf:distinct trong XPath 2.0
<xsl:template match="books">
  <authors>
    <xsl:for-each select="xf:distinct(book/@author)">
      <xsl:variable name="thisAuthor"><xsl:value-of select=".">
      <author name="{$thisAuthor}">
        <xsl:for-each select="book[@author=$thisAuthor]">
          <book title="{@title}" />
        </xsl:for-each>
      </author>
    </xsl:for-each>
  </authors>
</xsl:template>

Hàm này khác với hàm xsl:for-each-group như thế nào? Hàm xf:distinct có sẵn ở bất cứ nơi nào thực hiện XPath -- do nó có sẵn như là một phần của XQuery 1.0, cũng như các bộ xử lý XPath chuyên dụng. Với hàm xf:distinct, bạn có thể thực hiện việc xử lý khác trên tập giá trị, không như hàm xsl:for-each-group, buộc thực hiện riêng rẽ các giá trị khác nhau.

Chỉ một sự thay đổi này giải quyết nhiều vấn đề mà tác giả XSLT gặp phải khi cố gắng định kiểu các tài liệu. Còn có nhiều thay đổi khác với XSLT mà các nhà lập trình bảng định kiểu sẽ thấy có ích.


Hàm xf:document

Làm việc với nhiều tài liệu có thể có vấn đề trong XSLT 1.0. Các nhà thiết kế XPath 2.0 đã chọn lựa một cách khôn ngoan để bao gồm khả năng xử lý tài liệu bổ sung thông qua cơ chế của hàm xf:document. Hàm này cho phép một hoặc nhiều tài liệu được tải từ các địa chỉ URL và được xử lý. Ví dụ, giả sử bạn có kiểu tài liệu được hiển thị trong các Liệt kê 5, 6, và 7 trong một kho lưu trữ:

Liệt kê 5. Tài liệu phần mẫu 1
<part name="Grommets" size="3 in." color="blue" />
Liệt kê 6. Tài liệu phần mẫu 2
<part name="Grommets" size="3 in." color="blue" />
Liệt kê 7. Tài liệu phần mẫu 3
<part name="Grommets" size="3 in." color="blue" />

Giả sử bây giờ bạn có 500 tài liệu này trong một thư mục duy nhất, và bạn muốn tạo một danh sách tất cả các phần màu xanh dương mà bạn mang theo. Thay vì viết mã theo một ngôn ngữ tầng-giữa như Java để tải từng tài liệu này và tìm kiếm các phần có với màu xanh dương, bạn có thể viết một chỉ mục (xem Liệt kê 8) để liệt kê xem có thể tìm thấy tất cả các phần này ở đâu:

Liệt kê 8. Tài liệu chỉ mục của phần
<parts>
  <part file="part1.doc" />
  <part file="part2.doc" />
  <part file="part3.doc" />
</parts>

Bạn có thể viết một bảng định kiểu duy nhất thực hiện công việc này với một đoạn mã giống như một đoạn mã trong Liệt kê 9:

Liệt kê 9. xf:document được dùng để cắt ngang qua các tài liệu
<xsl:template match="parts">
  <blueParts>
    <xsl:for-each select="xf:document(part/@file)/@color='blue'">
      <part name={@name} size={@size} color={@color} />
    </xsl:for-each>
  </blueParts>
</xsl:template>

Kỹ thuật này khá phù hợp với các mạng nội dung phân tán, nơi có thể được đặt thông tin bộ phận trên một máy chủ và các thông tin khách trên một máy khác. Việc sử dụng các bảng định kiểu có sử dụng hàm xf:document để lấy thông tin từ các địa chỉ URL khác cho phép đặt dữ liệu này ở nơi đã tạo ra nó.


Hàm xf:current-dateTime

Khi một bảng định kiểu được áp dụng cho một tài liệu XML, để bao gồm ngày tạo kết quả chuyển đổi ở đầu ra là rất có lợi. Điều này đặc biệt quan trọng khi tạo các tài liệu HTML để điều khiển một giao diện người dùng; thông tin như vậy có thể giúp hệ thống lưu trữ trong bộ nhớ nhanh biết khi nào một bản sao thông tin đã cũ. Bạn có thể nhận được ngày và thời gian hiện tại khi sử dụng hàm xf:current-dateTime trong XPath 2.0 (xem Liệt kê 10):

Liệt kê 10. Ví dụ hàm xf:current-dateTime
<xsl:value-of select="xf:current-dateTime()" />

Hàm này có thể trả về chuỗi được hiển thị trong Liệt kê 11:

Liệt kê 11. Kết quả mẫu của hàm xf:current-dateTime
2002-09-17T18:22:08z

Sau đó, bạn có thể sử dụng chuỗi này như nó vốn có hay chuyển nó sang một định dạng ngày tháng khác để sử dụng trong tài liệu kết quả.


Tính tương thích Lược đồ XML tốt hơn

Do XPath 2.0 hiện đang được chia sẻ giữa XSLT 2.0 và XQuery 1.0, nên nó vẫn theo dõi xem XPath có cần hỗ trợ mạnh mẽ hơn cho Lược đồ XML không. Thật vậy, toàn bộ mô hình dữ liệu trong XPath 2.0 lúc này được định kiểu mạnh mẽ: Thay vì có các kiểu chuỗi, số, và boolean đơn giản, bây giờ các giá trị sử dụng các nguyên hàm được định nghĩa như là một phần của đặc tả lược đồ XML. Một tập đầy đủ các hàm được cung cấp để bạn có thể chuyển đổi dứt khoát các giá trị này từ một kiểu sang một kiểu khác như là một phần thao tác của chúng trong XPath 2.0. Ví dụ, một giá trị có thể đổi sang kiểu khác bằng cách sử dụng tên kiểu như thể nó là một hàm. Vì vậy, bạn có thể đổi kiểu giá trị thành kiểu số nguyên không dấu bằng cách sử dụng đoạn mã trong Liệt kê 12:

Liệt kê 12. Ví dụ đổi kiểu Lược đồ XML
xs:unsignedInt(item)

Việc định kiểu mạnh trong XPath 2.0 đảm bảo rằng một tài liệu được tạo bởi một bảng định kiểu XSLT có thể được xác nhận hợp lệ dựa vào một lược đồ XML được định kiểu mạnh mẽ. Trước XSLT 2.0, ví dụ, không có cách nào để đảm bảo rằng một số đã là một số nguyên không dấu -- bước xác nhận hợp lệ Lược đồ XML là cần thiết để đảm bảo rằng bảng định kiểu đã không cung cấp một giá trị bị lỗi.

Trong tài liệu này, tôi đã chỉ đề cập đến những điểm nổi bật về những gì XPath 2.0 cần cung cấp. Trong khi công nghệ này vẫn còn là một cách tốt, từ được quảng cáo đến trạng thái khuyến nghị (ít nhất là sáu tháng), thì việc tự làm quen với các tính năng và chức năng của XPath 2.0 sẽ chuẩn bị cho bạn tận dụng nó đầy đủ khi các công cụ bắt đầu xuất hiện.

Tài nguyên

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
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.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

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

Chọn tên hiển thị của bạn



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.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 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.

 


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


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=777362
ArticleTitle=XML với Dữ liệu: Có gì mới trong XPath 2.0?
publish-date=11302011