熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

Thinking XML: Firefox 3.0 和&n

2013-11-15 12:55:00  來源: ASP編程 

  Mozilla® 一直在改進其旗艦浏覽器並且最新的主要發行版 Firefox® 幾乎為每個人都提供了某種特性肯定不會忽略 XML 開發人員 — 新版本改進了基本解析DOMXSLTSVG 等等在本文中了解 Firefox 提供的用於 XML 處理的新特性關注添加的 EXSLT 擴展如何在浏覽器中使用 XSLT
對於目前存在的成百上千個 XML 處理工具Web 浏覽器仍然是操作的中心 — XML 開發人員十分幸運操作似乎永遠不會減慢過去的幾年裡我撰寫了關於開發人員喜愛的 Firefox 浏覽器中與 XML 相關的特性的一系列文章(請參閱 參考資料)我已經從 Firefox 介紹到了 最近Firefox 升級到 其中有很多全面改進以及大量用於 XML 處理的新的出色開發許多改進都來自核心 Web 處理引擎 Gecko 從 的升級

   版中的 XML 基本原理

  XML 領域包含大量技術但是全部內容的起點都是解析器Firefox 引入了對基本 XML 解析的一項巨大改進在過去的 Mozilla 浏覽器中解析 XML 文檔是同步的將阻止對文檔執行的所有操作直至完全載入該文檔對比 XML 解析與 HTML 解析後者一直都是異步的這樣文檔的各個部分在解析後就可以使用了對於用戶這意味著他將開始看到在浏覽器處理完頁面之前 Web 頁面是如何形成的另一方面使用 XML 文檔在完成解析前用戶根本看不到任何內容這是一個可用性問題不利於處理大型的 XML 文檔

  在 Firefox XML 內容模型是逐步構造的類似於 HTML這將使 XML 在 Web 上的實際應用產生重大變化有一些例外 — 最明顯的是 XSLT 不是逐步處理的理論上您可以使用 XPath 的有限子集逐步應用 XSLT 的子集但是這樣做本身就需要花費巨大精力並且超出 Firefox 的范圍

  我曾經希望 Firefox 中的改進之一是提供 xml:id 支持關於是否支持 xml:id 曾存在一些爭議但是如果可以出現在將來的發行版中那麼就可以使用一個補丁一般而言Firefox JavaScript 為在 XML 文檔中使用
getElementById 而提供的惟一方法是內部 DTD 子集(無外部子集並且沒有 xml:id)如果確實需要 xml:id請從 JavaScript 中使用 XPath 查詢 XML 名稱空間和 id 本地名稱中的屬性

  未能實現的另一個期望的核心改進是允許用戶請求浏覽器裝入外部 DTD 子集看上去好像補丁程序已就緒但是沒有足夠可用的開發人員資源完成 Q&A 過程因此未能在 Firefox 發行版中實現

  XML 領域包含大量技術但是全部內容的起點都是解析器Firefox 引入了對基本 XML 解析的一項巨大改進在過去的 Mozilla 浏覽器中解析 XML 文檔是同步的將阻止對文檔執行的所有操作直至完全載入該文檔對比 XML 解析與 HTML 解析後者一直都是異步的這樣文檔的各個部分在解析後就可以使用了對於用戶這意味著他將開始看到在浏覽器處理完頁面之前 Web 頁面是如何形成的另一方面使用 XML 文檔在完成解析前用戶根本看不到任何內容這是一個可用性問題不利於處理大型的 XML 文檔

  在 Firefox XML 內容模型是逐步構造的類似於 HTML這將使 XML 在 Web 上的實際應用產生重大變化有一些例外 — 最明顯的是 XSLT 不是逐步處理的理論上您可以使用 XPath 的有限子集逐步應用 XSLT 的子集但是這樣做本身就需要花費巨大精力並且超出 Firefox 的范圍

  我曾經希望 Firefox 中的改進之一是提供 xml:id 支持關於是否支持 xml:id 曾存在一些爭議但是如果可以出現在將來的發行版中那麼就可以使用一個補丁一般而言Firefox JavaScript 為在 XML 文檔中使用
XSLT 的重大改進

  希望在 Firefox 中使用 XSLT 的人們獲得的最大勝利是支持 EXSLT這是一組由 XSLT 社區開發和支持的 XSLT 擴展並且受到許多其他 XSLT 處理器的支持Firefox 添加了對於大型 EXSLT 子集的支持首先從 nodeset 函數開始這是解決 XSLT 中最嚴重的限制的重要方法EXSLT 被組織到各個模塊中每個模塊都定義若干個擴展函數和元素Firefox 在一組模塊中實現了一組擴展如下所示

  CommonFirefox 實現了通用函數的基本集合
exsl:nodeset 允許您將結果樹片段轉換為節點集這樣便可以對其應用 XPath
exsl:objecttype 是一個內省工具用於報告對象類型例如字符串節點集數字或者布爾值
SetsFirefox 實現了一些使用節點集的有用擴展
set:difference 將計算兩個集合之間的差異返回一個節點集該節點集的節點位於其中一個實參而不在其他實參中
set:distinct 將檢驗節點集以查找擁有相同字符串值的節點並且只保留每個節點的一個實例而將其余都刪除
如果返回的節點集中的節點在兩個集合中都有則 set:intersection 將計算交集
set:hassamenode 將確定兩個節點集是否有任何公共節點(例如它們是不是共享實際的同一個節點而不只是具有相同字符串值的不同節點與 XPath = 運算符一樣)
set:leading 將返回一個節點集其中的節點按照文檔順序要比另一個節點集中的第一個節點早出現
set:trailing 將返回一個節點集其中的節點按照文檔順序要比另一個節點集中的第一個節點晚出現
StringsFirefox 實現了一些使用字符串的有用擴展
str:concat 將返回一個字符串它見集合中每個節點的字符串值連接在一起(與內置的 concat 函數相比該擴展將連接固定順序的表達式)
str:split 將使用一種模式把一個字符串分隔為一連串子字符串(使用在運行時構造的節點集表示)
str:tokenize 將使用一組單字符標記把一個字符串分隔為一連串子字符串(使用在運行時構造的節點集表示)
MathFirefox 實現了一些函數這些函數可以讓您更輕松地從節點集內容中獲取最小數值量和最大數值量
math:max 將返回給定節點集中的內容的最高數值
math:min 將返回給定節點集中的內容的最低數值
math:highest 將返回內容中擁有最高數值的節點集
math:lowest 將返回內容中擁有最低數值的節點集
正則表達式Firefox 將正則表達式的功能引入到 XSLT 中
regexp:match 將在運行時構造節點集時針對字符串匹配正則表達式模式並返回匹配的子字符串
regexp:test 將檢查字符串是否與正則表達式模式完全匹配
regexp:replace 將替代匹配正則表達式模式的子字符串
通過示例了解 EXSLT

  為了幫助您開始在轉換過程中使用 EXSLT我構造了一個示例並在其中實踐了大量在 Firefox 中實現的函數我發現在浏覽器中使用 XSLT 的最佳實踐之一是交付針對半結構化數據的報告您將用戶引導向包含處理指令的 XML 文件應用 XSLT 轉換在這種情況下通常可以規定所需的浏覽器版本因此無需過於擔心跨浏覽器兼容性問題此外還將服務器的大量工作分擔到每個用戶的計算機中清單 (employeesxml)是一個員工信息文件我將針對該文件在 Firefox 中呈現一個報告
清單 員工信息文件 employeesxml
               
<?xml version= encoding=utf?>
<?xmlstylesheet type=text/xml ?>
<employees>
  <department id=res>
    <title>Research</title>
    <info>anddee for more info</info>
    <employee id=>
      <title>Coordinator</title>
      <name>
        <given>Rene</given>
        <family>Descartes</family>
      </name>
      <location building=PAR>France</location>
    </employee>
    <employee id=>
      <title>Project Manager</title>
      <name>
        <given>Abu Jafar</given>
        <family>Al Kwarizmi</family>
      </name>
      <location building=BAG>Iraq</location>
    </employee>
  </department>
  <department id=exec>
    <title>Executive</title>
    <info>Home of the head honchos</info>
    <employee id=>
      <title>Chief Executive Officer</title>
      <name>
        <given>Genghis</given>
        <family>Khan</family>
        <honorific>The Great</honorific>
      </name>
      <location building=MON>China</location>
    </employee>
  </department>
  <department id=hr>
    <title>Human Resources</title>
    <info>Were happy to serve you at ;/info>
    <employee id=>
      <title>Manager of Wellness</title>
      <name>
        <given>ChingYuen</given>
        <family>Li</family>
      </name>
      <location building=SZE>China</location>
    </employee>
  </department>
</employees>

注意位於頂部的 xmlstylesheet 處理指令將指示浏覽器使用 XSLT清單 (employeesxsl)是從 清單 生成報告的轉換

清單 通過員工信息文件(employeesxsl)生成報告的轉換
               
<?xml version= encoding=utf?>
<! A >
<xsl:transform version=
  xmlns:xsl=
  xmlns:math=
  xmlns:regex=expressions
  xmlns:set=
  xmlns:str=
  xmlns=
  excluderesultprefixes=set math regex str>
  <! Notice the namespace declarations for EXSLT
       Notice also excluderesultprefixes since you dont want those
       namespace declarations in the result XHTML
   >

  <! Use XML mode to approximate XHTML output
       (notice the doc type declaration info) >
  <xsl:output method=xml encoding=utf
              doctypepublic=//WC//DTD XHTML //EN
              doctypesystem=/>

  <xsl:template match=employees>
    <! Put the presentation style into a separate file
         specified using a processing instruction in the output >
    <xsl:processinginstruction name=xmlstylesheet>
      <xsl:text>type=text/css </xsl:text>
    </xsl:processinginstruction>
    <html xml:lang=en>
      <head>
        <title>Employee report</title>
      </head>
      <body>
        <h>Employee report</h>
        <table>
          <xsl:applytemplates/>
        </table>
        <hr/>
        <xsl:calltemplate name=stats/>
      </body>
    </html>
  </xsl:template>

  <xsl:template name=stats>
    <xsl:variable name=execs
      select=department[title=Executive]/employee/>
    <xsl:variable name=employeesinchina
      select=department/employee[location=China]/>
    <! Use set:hassamenode to check whether the two separate
         XPath queries have any node sets in common >
    <xsl:if test=set:hassamenode($execs $employeesinchina)>
      <p>Note: At least one executive presently works in China</p>
    </xsl:if>
    <dl>
      <dt>Countries where employees presently work</dt>
      <dd>
        <! Use set:distinct to eliminate duplicate country names
             from the query result >
        <xsl:foreach select=set:distinct(department/employee/location)>
          <xsl:valueof select=/>
          <xsl:if test=not(position()=last())>
            <xsl:text> </xsl:text>
          </xsl:if>
        </xsl:foreach>
      </dd>
      <dt>Newest employee</dt>
      <! Use math:highest to determine the highest numerical value of employee ID >
      <dd><xsl:valueof select=math:highest(department/employee/@id)/></dd>
    </dl>
  </xsl:template>

  <xsl:template match=department>
    <tr>
      <td colspan=>
        <! Use regular expressions to sniff out URLs from unstructured content >

  <! [] ensues that if multiple URLs are detected only the first is used >
        <a {regex:match(info //[azAZ_/\]* )[]}>
          <xsl:valueof select=title/>
        </a>
      </td>
    </tr>
    <xsl:applytemplates select=employee/>
  </xsl:template>

  <xsl:template match=employee>
    <tr>
      <td>
        <xsl:valueof select=name/given/>
        <xsl:text> </xsl:text>
        <xsl:valueof select=name/family/>
      </td>
      <td>
        <! Use str:concat to construct a composite ID from ancestor >
        <! If for example you added an id attribute to the root element
             the value would be appended for each employee >
        <xsl:valueof select=str:concat(ancestororself::*/@id)/>
      </td>
      <td>
        <xsl:valueof select=title/>
      </td>
      <td>
        <! Standard concat assembles a string from a fixed sequence of expressions >
        <xsl:valueof select=concat(location ( location/@building ))/>
      </td>
    </tr>
  </xsl:template>

  </xsl:transform>

  我在代碼中加了很多注釋突出說明了使用 EXSLT 的位置以及其他有用注釋生成的輸出將引用一個 CSS 樣式表主要用來演示這種模式清單 (employeescss)顯示了 CSS

  清單 通過員工信息文件(employeescss)生成的報告的演示樣式表
               
body { backgroundcolor: lightblue; }
td { paddingleft: em; }

  將 清單 裝載到 Firefox 中可以獲得圖 中的顯示

使用清單 生成的報告的 Firefox 顯示
使用清單 1-3 生成的報告的 Firefox 3.0 顯示

  結束語

  除了主要的解析改進以及 EXSLT 之外Firefox 還修正了在使用帶有名稱空間的 XML 文檔時遇到的遵從性問題DOMAttrModified 事件現在將正確處理名稱空間中的屬性並且對於元素在標記名中使用名稱空間前綴的子樹JavaScript DOM 方法 getElementsByTagName() 現在也可以正確處理

  有許多 CSS 和 JavaScript 補丁可以幫助簡化 XML 開發人員的工作

  可伸縮向量圖形(Scalable Vector GraphicsSVG)是所有人都喜歡的 XML 技術對於這種技術的用戶Firefox 甚至提供了更多優點它現在支持模式和掩碼(mask)讓您可以實現更豐富的效果支持全部 SVG 過濾器您現在可以向任何一個舊 Web 浏覽器對象應用 SVG 轉換例如這樣您可以決定將 IFRAME 旋轉 而這通常需要使用 Canvas 工具Mozilla 團隊已經提供了 SVG DOM 支持同時還修復了大量 bug

  有些人會說XML 並未在 Web 上獲得預料的成功但是有一點可以肯定的是您已經可以在浏覽器中用 XML 完成很多事情並且得益於 Web 浏覽器中的持續開發每年都會出現新的 XML 特性Firefox 是一個重要的裡程碑它實現了對 XML 處理的核心性能改進以及對 XSLTDOM 和 SVG 的增強您不會在嘗試使用這些新功能時出錯即使由於跨浏覽器需要而不能立即使用所有新功能隨著 Web 應用程序的不斷發展您也要做好應對未來的准備


From:http://tw.wingwit.com/Article/program/ASP/201311/21876.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.