本文将试着讨论不同格式XML文档之间相互转换的主题,比如怎样把格式化的纯数据转换成HTML文档,VML文档,或其他格式的XML文档,进一步,如何按每个具体的要求从源数据(元素/文本/属性)动态计算出目标数据(元素/文本/属性),再进一步,如何为生成的目标数据搭载特定的js代码,更进一步,如何使目标数据成为它的容器元素乃至父页面的 一部分,并实现动态交互。最后,如何做好垃圾清理工作,尤其对于数据更新频繁的容器,能否及时清除过期的文档结构和对象引用,同时又不影响新装入新内容和生成新对象。
一个XML文档转换工具至少应该具备两部分功能,模板和寻址。模板用来用来定义目标文档的结构,寻址功能负责在源文档中按指定路径返回数据,将寻址结果插入模板的特定位置,然后解析模板,生成目标文档,这个过程可以实现数据的静态转换。如下面代码。
源文档和模板文档
student.src.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <students> 3 <student sn="001"> 4 <name>张三</name> 5 <age>19</age> 6 </student> 7 <student sn="002"> 8 <name>李四</name> 9 <age>20</age> 10 </student> 11 <student sn="003"> 12 <name>王五</name> 13 <age>18</age> 14 </student> 15 </students>
| student.tpl.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <template rootname="table"> 3 <attribute name="border" value="1" /> 4 <element name="tr"> 5 <attribute name="bgcolor" value="#6699FF" /> 6 <element name="td"> 7 <text>学号</text> 8 </element> 9 <element name="td"> 10 <text>姓名</text> 11 </element> 12 <element name="td"> 13 <text>年龄</text> 14 </element> 15 </element> 16 <foreach base="/student"> 17 <element name="tr"> 18 <element name="td"> 19 <text path="." attr="sn" /> 20 </element> 21 <element name="td"> 22 <text path="./name" /> 23 </element> 24 <element name="td"> 25 <text path="./age" /> 26 </element> 27 </element> 28 </foreach> 29 </template>
|
转换代码
2 var tpldoc = $System.XML.XMLUtil.loadXMLFile("xmltest\\student.tpl.xml");
3 var tdoc = $System.XML.XMLUtil.XDOC.transformDoc(srcdoc , tpldoc);
4 $("div005").innerHTML = tdoc.xml;
转换结果
模板文档中中attribute元素用来生成目标文档中特定元素的属性,foreach元素负责遍历源文档中特定元素的集合。
代码运行试验,下载上一篇日志里的压缩包,解压,在test001.hta文件的同级目录下建立xmltest文件夹,将源文档存为student.src.xml,目标文档存为student.tpl.xml,然后拷贝转换代码到test001.hta中,运行,就可以看到转换结果了。