最近想在一个小应用中采用浏览器端的xinclude。找了一下,居然没有找到现成的实现。所以就打算自己写一个。
完整的xinclude实现也需要用到一些其它技术。最基本的就是xml base。
在html中你的链接如果不是absolute url形式,就需要相对于文档位置或者文档中用base元素定义的base url来resolve。
xml base和html的base有点类似,但是更加灵活,通过xml:base属性而不是单独一个属性来设置,所以可以有层次。例如:
<?xml version="1.0"?>
<doc xml:base="http://example.org/today/"
xmlns:xlink="http://www.w3.org/1999/xlink">
<head>
<title>Virtual Library</title>
</head>
<body>
<paragraph>See <link xlink:type="simple" xlink:href="new.xml">what's
new</link>!</paragraph>
<paragraph>Check out the hot picks of the day!</paragraph>
<olist xml:base="/hotpicks/">
<item>
<link xlink:type="simple" xlink:href="pick1.xml">Hot Pick #1</link>
</item>
<item>
<link xlink:type="simple" xlink:href="pick2.xml">Hot Pick #2</link>
</item>
<item>
<link xlink:type="simple" xlink:href="pick3.xml">Hot Pick #3</link>
</item>
</olist>
</body>
</doc>
这个示例代码抄自于
xml base规范。其中的xlink解析后如下:
* "what's new" resolves to the URI "http://example.org/today/new.xml"
* "Hot Pick #1" resolves to the URI "http://example.org/hotpicks/pick1.xml"
* "Hot Pick #2" resolves to the URI "http://example.org/hotpicks/pick2.xml"
* "Hot Pick #3" resolves to the URI "http://example.org/hotpicks/pick3.xml"
原理还是一目了然的。但是要做出一个完全符合标准,并且鲁棒的实现也不是很容易的。
首先是确定我们的API。
API决定了我们如何利用xml base。
本身xml base是很简单的,你可以直接在xml文档中加入xml:base属性即可。然后就是application的问题了。比如你使用xlink,或者xinclude,或者其它属性(比如各种xml格式中常见的链接)——关键是应用是否能利用它来算出每个链接(有可能是relative URI)的最后的absolute形式。
所以API就呼之欲出了。
对于xml文档中的一个uri,其要么是在文本(text node或cdata中),要么是在属性中(实际上还有其它,如entity,PI等,我们暂时忽略)。那么我们的参数就是uri,和uri所在的node,我们希望得到的,就是最后的absolute uri。如下:
resolveURI(node, uri)
从node开始,我们可以根据xml base算出其 base URI。所谓base URI,是URI规范(
RFC2369)中的术语,relative URL是根据base URI进行resolve的。xml base中得到一个node的base URI的大体算法如下:
如果这个node是text node或cdata,其base URI就是该node的parentNode,也就是一个element的base URI。
如果这个node是attr,其base URI就是该attr所属的element。
如果这个node是element,那么如果它有xml:base属性,那base URI就是xml:base属性所表达的URI——注意xml:base属性也可以是relative URI,所以它自身也要根据更上一级的base URI来resolve。如果没有xml:base属性,那其base URI就是父元素(或者最上层的document节点)的base URI。注意,有时候可能没有父节点,比如这个node刚创建出来还没有插入DOM树,或者已经被从DOM树上remove了,这个时候base URI就是null。
如果这个node是document,则其值为documentURI,通常是document的资源地址,但是有时候是null,例如你是从内存中产生的,或者从字符串parse出来的。
这个算法其实比较简单,就是递归向上找。
实际上,DOM中已经有这样一个baseURI属性了。
DOM Level 3增加了Node.baseURI属性,用来返回一个节点的baseURI。所谓baseURI,是由XML infoset所规定的一个xml属性,其计算方式就是根据xml base规范来的(你可以看到,w3c的规范是一个规范集合,互相独立但是又紧密关联),也就是我上面描述的过程。
Firefox 2.0虽然没有完全支持DOM Level 3,但是它是支持xml base规范和baseURI属性的。Safari 3也是支持的(虽然其支持有些问题,后述)。
显然,你料到了,IE 6不支持baseURI。
其它浏览器,如IE 7,Opera等,我暂时未及测试。有兴趣的同志可以测一下。
为了兼容IE 6和其它不支持baseURI属性的,我又定义了
baseURI(node)
其含义等价于DOM Level 3的 Node.baseURI。
API好了之后,我们就可以实现它了(当然其实应该先写测试用例,呵呵)。
代码明天再发。
分享到:
相关推荐
### 关于Base64编码及Java与JavaScript的实现 #### Base64简介 Base64是一种将二进制数据转换为ASCII字符串表示形式的方法。它主要用于处理非文本数据的存储和传输,例如图像、视频等多媒体文件。由于互联网传输...
标题“JS传递XML文件”指的是如何在JavaScript中构建一个机制,安全地将XML数据传输到ASP.NET后端。描述中提到的问题是ASP.NET在接收到请求时检测到可能含有HTML标记或脚本的数据,这可能引发安全问题。因此,我们...
XML是一种结构化数据格式,而Excel则是一个流行的电子表格应用程序,用于存储、管理和分析数据。本篇文章将深入探讨如何在JavaScript环境中进行XML与Excel之间的转换。 1. **XML转Excel**: - **基本概念**:XML...
Js实现Base64编码与解码 Base64其实是一种简单的置换加密方式,但是BASE64的用处往往并不是为了防止信息泄露,而且为了方便传输,进过BASE64编码后的信息会比原始信息长,大概是4/3倍。 Base64是一种基于64个可打印...
1. **Base64编码原理**:Base64是基于64个字符的编码系统,包括大小写字母、数字和两个特殊符号('+', '/'),以及一个分隔符'='。每个6位的二进制数据块被转换为对应的Base64字符,不足6位的则用0填充。最后,如果...
java端:返回类型非字符接口调用StringUtils#base64AndCompressJson进行编码压缩 ,返回类型为字符接口调用StringUtils#base64Andcompress js 端:引入压缩包中的js文件 ,调用deBase64AndUncompress进行解压解码
在给定的`js-base64 20150121_javascriptbase64_carry9i1_jsbase64_64cacom_`这个压缩包中,我们预计会找到一个JavaScript实现的Base64库,可能被用于在浏览器环境中进行Base64编码和解码。 Base64算法的核心原理是...
它将每3个字节的数据拆分为4个6位的“单词”,然后将每个6位的数字映射到一个特定的字符,从而形成可打印的ASCII字符串。 PDF与Base64之间的转换涉及到文件处理和数据编码的知识点: 1. **PDF转Base64**: 当你...
2. 创建XML结构:接下来,构建一个XML文件结构,将Base64编码的图片数据作为值插入到XML元素中。例如: ```xml <filename>example.jpg <width>800 <height>600 <created>2022-01-01 此处填写Base64编码的...
本文将详细介绍如何利用JavaScript和XML来构建一个具有二级联动功能的下拉菜单。此菜单的一个显著优势是它能够覆盖网页上的任何元素,包括`select`、`object`或`flash`等,这使得它在复杂布局中更为实用。 ##### ...
这64个字符包括大小写字母(A-Z, a-z)、数字(0-9)以及两个特殊符号(+ 和 /),还有一个等于号(=)用于填充。每个字符代表6位二进制值,因此每3个字节(24位)的数据会被拆分成4个6位的块进行编码。如果原始数据...
总的来说,Base64是一种在不同系统之间传输二进制数据的便捷手段,而“Base64 加密解密小工具”则为用户提供了一个方便快捷的实现这一功能的平台。通过理解和熟练运用这类工具,可以更好地处理各种涉及二进制数据...
在本文中,我们将深入探讨如何使用XMLDOM和ADODB.Stream对象在JavaScript中实现Base64编码和解码。Base64是一种用于将二进制数据转换为ASCII字符串的编码方法,常用于在网络上传输非ASCII字符的数据,如图片或文件。...
Base64.js-master 是一个JavaScript库,主要用于处理Base64编码和解码,同时也被用于文件上传功能。在Web开发中,特别是在不支持File API或者FormData的旧版浏览器中,Base64编码常用于将二进制数据转换为可安全传输...
在JavaScript中实现将文本和图片(包括常规的images和canvas绘制的图像)导出到Word文档,是一项常见的需求,尤其在网页应用中。...这是一个多方面综合的技术挑战,但通过适当的工具和策略,可以有效地解决。
要实现这个目标,我们可以自定义一个XML序列化器,继承自`System.Xml.Serialization.XmlSerializer`,然后重写其`Serialize`方法来控制XML的生成过程。以下是一个简单的示例: ```csharp public class ...
这个"js+html5拍照压缩图片上传.rar"的压缩包就是一个典型的例子,它集成了Base64编码、JS插件、HTML5的图片处理功能以及JS拍照上传的解决方案。下面我们将详细探讨这些知识点。 首先,`Base64`是一种用于在网络上...
【base64转Mp4工具.zip】是一个压缩包文件,其中包含了将Base64编码的文本转换为MP4视频格式的工具。这个工具的主要目的是帮助用户处理已经编码为Base64格式的视频数据,将其解码并转换为可播放的MP4文件。Base64是...
Base64编码是一种数据编码方法,它将任意的二进制数据转换成由64个可打印字符组成的编码,这些字符包括大写字母A-Z、小写字母a-z、数字0-9以及加号(+)和斜杠(/),还有一个等号(=)作为填充字符。由于Base64编码将每3...
首先,定义了一个包含中文字符的字符串,然后用`base64_encode()`进行编码,输出编码后的结果,再通过`base64_decode()`解码回原始数据。 如果`demo.php`文件还涉及到URI编码,那么可能会有类似以下的代码: ```...