web前端

位置:IT落伍者 >> web前端 >> 浏览文章

Thinking XML: Firefox 3.0 和&n


发布日期:2018年04月19日
 
Thinking XML: Firefox 3.0 和&n

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 显示

结束语

除了主要的解析改进以及 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 应用程序的不断发展您也要做好应对未来的准备

               

上一篇:移动web.config文件时造成的错误

下一篇:关于zedgraph在web中的两种工作方式