DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 使用 XML: XSLT 2.0 和XQuery對比
使用 XML: XSLT 2.0 和XQuery對比
編輯:XML詳解     

正在進行的標准化

  自從 1999 年 11 月面世以來,我發現 XSLT(XSL 轉換語言)是可用於操作 XML 文檔的最有用的工具之一。許多可用的 API 和工具在 Java 或其他語言中使用 XML 文檔,而且我在不同項目中使用了許多 XML 文檔,但想不起有哪個 XML 項目不使用一點 XSLT 了。

  那麼我對 XSLT 2.0 開發有濃厚的興趣就不足為奇了。XSLT 是功能強大的語言,它高級到甚至可以處理最復雜的操作,但它也非常冗長,以至於調試和維護大型樣式表非常困難。W3C 希望解決這個問題和其他問題,所以將要發布兩種語言:XSLT 2.0 和 XQuery 1.0。本文對這兩種即將面世的語言進行比較,並提供了一些有關如何有效利用這兩種語言的指導。

  在撰寫本文時,XSLT 2.0 和 XQuery 1.0 還處於 Candidate Release 狀態,該狀態是 W3C 用於不久要采用的標准的行話。多久?這取決於審查過程。

  大量重疊

  在設計上,XSLT 2.0 和 XQuery 1.0 有許多共同點。兩種語言都基於同一基礎:XPath 2.0。兩種語言都專用於操作 XML 文檔。兩種語言都借用腳本 概念,即對簡單任務使用解釋語言。實際上,可以使用其中任一語言達到給定目的。兩者功能相當。但是,每種語言都有不同的個性,我覺得,取決於要進行的任務,也可能取決於您的個性,您可能會更喜歡使用其中的一個,所以兩個都值得學習一下。

  下文將簡單介紹兩種語言的共同點和各自的特點,以便您選擇適合自己的風格和正在進行的任務的一種語言。

  XPath 基礎

  首先介紹 XPath 2.0。XSLT 由兩種語言打包而成:XPath 語言和 XSLT 本身。XPath 是用於查詢元素的語言,例如,選擇屬性或指定模板匹配(XSLT 中的匹配屬性)時。XSLT 語言是用於指定轉換結果的語言,指令包括 xsl:apply-templates、xsl:value-of 和 xsl:for-each 等。

考慮 清單 1 中的 XSLT 模板。它混合了一些 XPath 語言(match 和 select 屬性)、來自 XSLT 本身的元素(模板和 xsl:value-of 指令)和來自結果語言的元素(Html 和 head):

  清單 1. XSLT 模板

<xsl:template match="rss">
  <Html>
   <head><title><xsl:value-of select="channel/title"/></title></head>
   <xsl:apply-templates/>
  </Html>
</xsl:template>

  XPath 和 XSLT 之間的任務分離並不新奇,但因為沒有其他語言是基於 XPath 的,因此在 XQuery 出現以前,二者主要是理論區別。

  XPath 2.0 是重要升級

  XPath 2.0 是非常重要的升級。XPath 1.0 只能查詢 XML 文檔中的節點。XPath 2.0 可以操作序列,而序列可以包含節點(所以不會丟失任何內容)以及字符串、整數和其他原子值。差別雖細小但很重要:現在可以通過第二次查詢提煉查詢結果。以前在 XSLT 1.0 中,鏈接兩個查詢需要專用的功能。

  另一個重要的更改是 XPath 2.0 支持循環和變量。換句話說,您可以在 XPath 中聲明變量並從 XPath 中為其賦值。同樣地對於循環,您可以在 XPath 中運行循環以計算返回值,例如,在處理發票行時用數量乘以價值。仍可以在 XSLT 中聲明變量,XSLT 中的循環功能也有所增強。在升級中包裝了許多強大功能!

  新選項極大地簡化了 XSLT 樣式表。在 XSLT 1.0 中,必須編寫許多算法,甚至遞歸編寫簡單算法。例如,計算發票總計時通常都需要遞歸算法。但在 XSLT 2.0 中再也不必如此了,這大大歸功於 XPath 2.0 中的新功能。

  XQuery 與 XSLT

 XSLT 樣式表可用於任何 XML 操作。就我個人而言,我曾使用 XSLT 進行網站發布、編譯報告、計算統計、預處理 XML 文件,轉換不同詞匯或軟件、准備導入數據庫中的數據、處理數據庫導出,甚至響應 Web 服務請求。

  實際上,這是濫用語言。當然它能工作,但有時候最終的結果是與語言對抗。得到的樣式表有太多遞歸函數,難以調試。

  顧名思義,問題在於 XSLT 設計用於轉換文檔以發布,而非其他目的。XSLT 旨在作為一種通用查詢語言,盡管它總是在沒有更好選擇的情況下被使用。與此相反,XQuery 設計用於查詢文檔和准備報告。

  不同風味

  不可否認,轉換 和查詢 是涵蓋許多應用的通用詞。已經介紹過,兩種語言能力相當,因為它們都基於 XPath 2.0。但它們強調不同的用法模式,從而使其適用於不同的任務。

  XSLT 的設計者假設您有意於處理大部分文檔,這種假設在發布時是合理的。因此 XSLT 具有內置的遍歷引擎,在默認情況下會處理整個文檔。他們還假設您通常使用文本信息,因此 XSLT 不是一種強類型語言,最後,他們還假設您將以標記語言生成文檔,因此 XSLT 編寫為 XML 詞匯。

  XQuery 的設計者作了不同的假設。他們假設您在運行查詢時希望將范圍縮小到文檔的一些章節,所以他們圍繞 XPath 查詢構建該語言。XQuery 沒有默認行為,一切由您主宰。

  他們還假設您使用有類型的數據,比如數據庫抽象,而 XQuery 是強類型語言。最後,語法絕對不是 XML。

  示例

  為了闡明 XSLT 2.0 和 XQuery 1.0 之間的差異,我們來看一個示例。

  為了比較兩種語言,人們通常用兩種語言編寫同一個算法,但在特殊情況下,這樣並不公平。因為每種語言都是在其他語言表現不佳的任務中表現良好,所以使用一個示例將給出有偏頗的結果。所以我決定使用兩個示例:一個轉換示例用於 XSLT,一個查詢示例用於 XQuery。通過比較,將會發現為什麼這些語言適用於不同的需要。

XML 文檔

  兩個示例都在 清單 2 上運行,清單 2 是 RSS 中的文章列表。

  清單 2. 文章列表

<?XML version="1.0"?>
<rss version="2.0">
<channel>
 <title>Projects in the "Working XML" column</title>
 <description>A selection of ben's article on
   developerWorks.</description>
 <language>en</language>
 <link>http://www.ibm.com/developerWorks/XML</link>
 <item>
  <title>Safe coding practices</title>
  <pubDate>Fri, 6 May 2005 00:00:00 GMT</pubDate>
  <link>http://www.ibm.com/developerworks/XML/library/x-wxxm30.Html</link>
  <description>Most common pitfalls and how to avoid them (4 parts).</description>
 </item>
 <item>
  <title>The Eclipse task list</title>
  <pubDate>Fri, 22 Oct 2004 00:00:00 GMT</pubDate>
  <link>http://www.ibm.com/developerworks/library/x-wxxm27/</link>
  <description>Various techniques on integrating XML and Eclipse (4 parts).</description>
 </item>
 <item>
  <title>XML, XMI and code generation</title>
  <pubDate>Wed, 31 Mar 2004 00:00:00 GMT</pubDate>
  <link>http://www.ibm.com/developerworks/XML/library/x-wxxm23/</link>
  <description>Using modeling for XML development (4 parts).</description>
 </item>
</channel>
</rss>


 

XSLT 示例

  清單 3 是 XSLT 樣式表。它用 Html 發布 RSS 文檔。該樣式表包含 清單 2 中每個元素的模板 (xsl:template),它依賴 XSLT 處理器選擇最適合的模板。可以看到,樣式表假設您將處理整個文檔。XSLT 還將很好地處理混合元素。

  清單 3. XSLT 樣式表

<?XML version="1.0"?>
<xsl:stylesheet
  XMLns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="Html"/>
  <xsl:template match="rss">
   <Html>
     <head><title>
      <xsl:value-of select="channel/title"/>
     </title></head>
     <xsl:apply-templates/>
   </Html>
  </xsl:template>
  <xsl:template match="channel/title">
   <h1><a href="{../link}"><xsl:apply-templates/></a></h1>
  </xsl:template>
  <xsl:template match="title">
   <h2><a href="{../link}"><xsl:apply-templates/></a></h2>
  </xsl:template>
  <xsl:template match="description">
   <p><xsl:apply-templates/></p>
  </xsl:template>
  <xsl:template match="pubDate | link | language"/>
</xsl:stylesheet>

  注意聲明方法:您指定如何處理元素,處理器(通過其內置的樹遍歷邏輯)決定何時應用模板。添加和移除模板很容易。代碼不包含循環,因為處理器已經知道如何遍歷文檔。

  XQuery 示例

  清單 4 是 XQuery 示例。它運行兩個查詢:一個用於提取星期五發布的文章列表,一個用於列出討論 XMI 的文章。

  清單 4. XQuery

<result>
{
 for $i in doc("rss.XML")/rss/channel/item
 where starts-with($i/pubDate/text(),"Fri")
 return
  <friday>
   { $i/title/text() }
  </friday>
}
{
 for $i in doc("rss.XML")/rss/channel/item
 where contains($i/title/text(),"XMI")
 return
  <xmi>
   { $i/title/text() }
  </xmi>
}
</result>

  比較 清單 4 和 清單 3。在 XQuery 中,代碼依賴於 XPath 直接指向感興趣的元素,且循環必須顯式編寫。從文檔中提取報告時,它十分理想。

  決策時間

  我開始使用 XSLT 2.0 和 XQuery 1.0 作為 XPath 2.0 的不同語支。每種語支適用於特定的應用程序。只有時間能說明這兩種語支是否都將茁壯成長。就目前來看,我打算專注於 XPath 2.0,並根據要開發的應用程序使用最適合的語支。

 

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved