[/*SemanticWeb*/][转]XInclude,有人吗? |
nybon 发表于 2004/12/13 23:09:50 |
XInclude,有人吗?Chris Lovett 2000年5月29日
500)this.width=500'> 下载本文的源代码 (38.4K)
如何创建包含来自其他地方的 XML 大块的 XML 文档呢?关于这一问题,程序员都知道怎么做,因为编程语言提供这一功能已有几十年了。每当您让一组编程人员处理相同的产品时,都会希望把它划分成能管理的大块。然而,如何处理 XML 呢?当我为我们组维护基于 XML 的 intranet Web 站点时,就遇到了这一问题。
XInclude 阐述了在树级合并两个 XML 资源所需的低级操作。
问题
有太多的方法可将人们想要在我们的内部 Web 站点上发布的信息划分成片段了。 我们有两个轴心。第一个轴心是按信息的类型划分,包括规范、开发信息、测试、文档和发布信息。
第二个轴心是按组划分。我们有四个小组,每个小组负责一个特定的领域。在 Microsoft 内部还有一些监视一切进展情况的人员;负责编制整个产品文档的集中的用户培训组;以及负责管理实际建立和发布所有内容的发布组。
各小组希望见到与他们的工作有直接关联的材料,而不想看到混杂在其中的其他组的信息。我们还需要为想要看到所有材料的人准备的主站列表。
ASP 解决方案?
解决此问题的强制方式是通过写入如下一些 Active Server Pages (ASP) 代码来汇编主站列表:<%@LANGUAGE=JSCRIPT%>
<%
var list = new Array("/team1/specs.xml",
"/team2/specs.xml",
"/team3/specs.xml",
"/team4/specs.xml");
var master = new ActiveXObject("Microsoft.XMLDOM");
aster.load(Server.MapPath("/central/allspecs.xml");
var root = master.documentElement;
var doc = new ActiveXObject("Microsoft.XMLDOM");
for (i = 0; i < list.length; i++) {
doc.load(Server.MapPath(list[i]));
root.appendChild(doc.documentElement);
}
var xsl = new ActiveXObject("Microsoft.XMLDOM");
sl.load(Server.MapPath("/central/allspecs.xsl");
aster.transformNodeToObject(xsl, Response);
%>
这样将允许每个小组都能保留自己的本地列表,并能通过转到 Web 站点的特定区域来查看它们。但是,它仍能为其他人提供主站列表,使得皆大欢喜。
该方法存在几个问题。第一,从一个组的规范页面盲目复制所有内容的做法不够明智。我需要更聪明的解决方案。第二,它不参与客户机端的 XSL,所以 Web 服务器花费了宝贵的 CPU 时间来建立这些页面。
XSL 解决方案
为了改进上述问题,在常驻 XSL 大师 Jonathan Marsh 的帮助下,我用 XSL 建立了此操作方式的原型。如果您安装了 Internet Explorer 5,就会看到以下结果:
主页
规范
Team1.xml
Specs.xml
Team2.xml
Specs.xml
Master.xml
MasterSpecs.xml
第 1 组和第 2 组有列出规范、交付、测试和发布信息的自己的本地页。(注意:此示范中仅提供了规范页。)主页附带简介,指向每个组,并指向 MasterSpecs 页。
MasterSpecs 页是有趣的地方。该页集合了 Team1 和 Team2 的规范。您可能会注意到,随着信息从其他页被编译,该页被异步植入。它的设计如下:<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="/voices/website.xsl"?>
<!DOCTYPE website SYSTEM "common.dtd">
<website xmlns:x="http://www.w3.org/1999/XML/xinclude">
<title>Master List of all Specs</title>
<p>
<font color="red"><i>Our team has been busy this week!</i></font>
</p>
<h2>Team 1</h2>
<x:include href="team1/specs.xml#xpointer(/website/link)"/>
<h2>Team 2</h2>
<x:include href="team2/specs.xml#xpointer(/website/link)"/>
&disclaimer;
</website>
请注意 x:include 元素。这些元素包含指向每组规范的 href 属性,该属性具有 XPointer URL 片段(英文) 500)this.width=500'>, 该片段精确定义主站列表中应包含规范中的哪些元素。(实际上,在我的原型中,它不是真正的 XPointer;它只是 XPath 表达式)。
website.xsl 样式表找到这些 x:include 元素;加载由它们引用的页;用匹配 XPointer 表达式的节点替换 x:include 元素;然后在聚合后的文档上重新运行样式表。
这意味着 MasterSpecs 作者可全盘控制 MasterSpecs 页的外观和感官,特别是在包含内容的地方。同时,MasterSpecs 作者不必担心与频繁更改的规范列表的同步,这些规范列表由各个小组维护着。
它是如何工作的?
我想您可能会问到这个问题。首先,XSL 样式表包含名为 xinclude.js 的辅助 JScript® 文件。并且,它还包含一个脚本块,每当一页加载完毕时即触发该脚本块。<SCRIPT src="/voices/xinclude.js"></SCRIPT>
<SCRIPT for="window" event="onload">
<xsl:comment><![CDATA[
ProcessXIncludes(document.XMLDocument);
]]></xsl:comment>
</SCRIPT>
Internet Explorer 5 中内置的 XML Viewer 提供了 XMLDocument 属性。该 xinclude.js 文件包含四种函数。
函数
用途
ProcessXIncludes
该函数采用原始的 XML 文档,复制它,然后调用 StartProcessing。该副本形成了新的组合文档的基础。
StartProcessing
该函数找到了所有 x:include 元素,并建立异步下载的 XML 文档的数组 (_docs)。它还分析将 XPointer 划分为片段的 href,并将其保存到另一个数组 (_pointers and _hrefs) 中。然后它保存真正的 x:include 节点 (_nodes),以便 CombineXML 可以用实际包含的节点替换它们。
HandleComplete
该函数是 onreadystatechange 回调,当 XML 文档状态发生变化时调用它。当准备状态达到 4(完成)时,该函数调用 CombineXML 处理包含的文档。当所有包含的文档都处理完后,HandleComplete 还重新运行原始的转换,并用此结果更新 HTML 页的正文。
CombineXML
该函数在下载的文档上运行 XPointer 选择,并用它找到的内容替换 x:include 元素。如果下载的文档发现错误,则 CombineXML 还会插入错误说明。
总而言之,这 133 行的代码 — 包括 XSL 样式表中的脚本块,我认为很有价值。迄今为止,我用它维护了关于规范、发布信息和跟踪的标准的主站列表,它工作得很好。
最终解决方案是什么?
最终,如果在 XML 堆栈的下部 — XML 分析程序或 XML DOM 内部的深处,支持 XInclude 处理,则效果会更好。这样,我的样式表就能完全忽视此步骤了,而且无论在客户机上还是在服务器上,样式表所起的作用都是一样的。
实际上,World Wide Web Consortium (W3C) 正在研究正确完成此项任务的标准方式。这种方法叫做 XInclude500)this.width=500'>,它与 XLink 相关500)this.width=500'>,XLink 是 W3C 正在研究的另一种规范。
您可以使用带属性值 show="embed" 的 XLinks,来取得类似的效果。于是该资源将以图形方式,嵌入文档的显示中。但它与内含物有许多差别。嵌入的资源保留它自己的特性 — 特有的文档树,具有从原始文档继承而来的对象模型和样式特性(不是从主机文档继承的)。一个近似做法是,用 XSLT 将这一 XLink 转换为显示目标资源中所需要部分的 IFRAME。
另一方面,XInclude 指定了在树级合并两个 XML 资源的必要操作。其结果是一棵单一的树,而不是两棵链接的树,并且一个单独的样式表即可建立该树的样式。该进程可在低层级执行(分析和创建文档树),而不在高层级执行(处理显示元素)。
可以用来改进该原型的措施:
全面的 XPointer 支持。指定要包含的标记的范围的能力是非常有用的。
将 XSL 样式表置入 W3C XSLT 格式。
原型不处理包含文档中的相关链接。修正这一点将非常有用。适当的修正涉及另一个 W3C 规范,XML Base500)this.width=500'> (XBase)。
|
|
|

.: 公告
This blog focuses on:
Semantic Web && Java Technology |
|
« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
|
.: 我的分类(专题)
|

.: 最新日志
.: 最新回复
|

blog名称:SW Portal 日志总数:171 评论数量:219 留言数量:8 访问次数:1048963 建立时间:2004年10月30日 |
|

.: 留言板
|

.: 链接
|

|