本站首页    管理页面    写新日志    退出

The Neurotic Fishbowl

[/*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)。

阅读全文(1942) | 回复(0) | 编辑 | 精华

 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

 
 



The Neurotic Fishbowl

.: 公告

This blog focuses on:

Semantic Web && Java Technology


Bloginess

«September 2025»
123456
78910111213
14151617181920
21222324252627
282930

.: 我的分类(专题)

首页(171)
/*SemanticWeb*/(34)
/*Java*/(74)
/*FreeComments*/(59)
/*Agent*/(4)


In the Bowl

.: 最新日志

The End
使用Google Trends进行选型
怎样才能称为一次新的版本发行?
如何防止RSS信息过载
使用Excel作为用户接口
如何有效地报告Bug
sourceforge再次被封
趣文两篇
编写Firefox扩展
Jetspeed心得随笔


.: 最新回复

回复:Google API与yahoo 
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:Jbpm和Shark比较的feat
回复:JADE 3.3的bug
回复:JADE 3.3的bug
回复:[转]批判性地看待一种可行的表示技
回复:JIRA破解


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



Text Me

.: 留言板

签写新留言

路过
路过
页脚问题
RE:请问一下你的主页的下面部分是怎么关
请问一下你的主页的下面部分是怎么关闭的?
我是做Mobile Agent的
Gmail
不错
不错啊小倪同学


Other Fish in the Sea

.: 链接





站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144782875 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号