JaveScript 中使用 XSLT转换XML文档
我们经常将数据存储在XML 中,在展示的时候需要转换为其它的形式,这里介绍使用XSLT 对XML数据进行转换。
要学习XSLT对XML的转换,需要先了解三个文件。
第一个是存储数据的XML文件:employees.xml
<?xml version="1.0"?>
<employees>
<employee title="Software Engineer">
<name>Nicholas C. Zakas</name>
</employee>
<employee title="Salesperson">
<name>Jim Smith</name>
</employee>
</employees>
第二个是存储XSLT的文件:employees.xslt
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" /> <xsl:template match="/">
<ul>
<xsl:apply-templates select="*" />
</ul>
</xsl:template> <xsl:template match="employee">
<li><xsl:value-of select="name" />, <em><xsl:value-of select="@title" /></em></li>
</xsl:template> </xsl:stylesheet>
第三个是我们进行转换的代码example.htm:
<!DOCTYPE html>
<html>
<head>
<title>XSLTProcessor Example</title> <script type="text/javascript">
window.onload = function () { //use XHR to load
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("get", "employees.xml", false);
xmlhttp.send(null);
var xmldom = xmlhttp.responseXML; xmlhttp = new XMLHttpRequest();
xmlhttp.open("get", "employees.xslt", false);
xmlhttp.send(null);
var xsltdom = xmlhttp.responseXML; var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom); var result = processor.transformToDocument(xmldom);
var div = document.getElementById("divResult"); var xml = (new XMLSerializer()).serializeToString(result);
alert(xml);
div.innerHTML = xml; }
</script>
</head>
<body>
<p>This example loads employees.xml and transforms it using employees.xslt.
The resulting code is then displayed.</p>
<div id="divResult"></div>
</body>
</html>
在这里我们通过 XSLTProcessor 类型使用XSLT转换XML文档,第一步加载两个DOM文档,一个基于XML,另一个基于XSLT,下面的代码在Edge 中可以顺利执行,在Chrome中,因为禁止从本地装载文件随意会会失败,如果从网络服务器上读取数据则没有问题。
//use XHR to load
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("get", "employees.xml", false);
xmlhttp.send(null);
var xmldom = xmlhttp.responseXML; xmlhttp = new XMLHttpRequest();
xmlhttp.open("get", "employees.xslt", false);
xmlhttp.send(null);
var xsltdom = xmlhttp.responseXML;
然后创建一个新XSLTProcessor对象,并使用importStylesheet()方法为其指定一个XSLT
var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom);
最后一步是执行转换,这一步有两种不同的方式,如果想返回一个完整的DOM文档,可以调用transformToDocument().而通过调用transforToFragment()则可以得到一个文档片段对象。一般来说。使用transformToFragment()的唯一理由,就是你想把返回的结果添加到另一个DOM文档中。
在使用transforToDocument()时,只要传入XML DOM,就可以将结果作为一个完全不同的DOM文档来使用。来看例子
var result = processor.transformToDocument(xmldom);
我们将result 结果进行序列化
var xml = (new XMLSerializer()).serializeToString(result);
来看转换后的结果
<ul>
<li>Nicholas C. Zakas, <em>Software Engineer</em></li>
<li>Jim Smith, <em>Salesperson</em></li>
</ul>
下面我们来看一下XSLT中的定义:
下面的这段代码会让我们将所有的内容都放到<ul></ul>之中,之所以会这样是因为我们的选择符指定了全部 select="*"
<xsl:template match="/">
<ul>
<xsl:apply-templates select="*" />
</ul>
</xsl:template>
下面这段代码的含义是对 employee 元素进行转换 match="employee"
将name 元素放到<li></li>中 select="name"
将title 属性提取出来放到<em></em>中 select="@title"
<xsl:template match="employee">
<li><xsl:value-of select="name" />, <em><xsl:value-of select="@title" /></em></li>
</xsl:template>
而transformToFragment()方法接收两个参数:要转换的XML DOM 和应该拥有结果片段的文档。换句话说,如果你想将返回的片段插入到页面中,只要将document作为第二个参数即可。
我们只需要将example.htm中 23 - 28 行代码替换成下面代码就可以了。
var fragment = processor.transformToFragment(xmldom, document);
var div = document.getElementById("divResult"); div.appendChild(fragment);
这里,处理器创建了一个有document对象拥有的片段。这样,就可以将返回的片段添加到页面中已有的<div>元素中了。
在XSLT样式表的输出格式为"xml","html"的情况下,创建文档或文档片段会非常有用。
1.使用参数
XSLTProcessor 也支持使用 setParameter()来设置XSLT的参数,这个方法接收三个参数:命名空间URI,参数的内部名称和要设置的值。通常,命名空间URI都是null,而内部名称就是参数的名称。另外必须在调用transformToDocument()或transformToFragment()之前调用这个方法。来看例子
我们先看XSLT文件 employees2.xslt:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" /> <xsl:param name="message" /> <xsl:template match="/">
<ul>
<xsl:apply-templates select="*" />
</ul>
<p>Message: <xsl:value-of select="$message" /></p>
</xsl:template> <xsl:template match="employee">
<li><xsl:value-of select="name" />, <em><xsl:value-of select="@title" /></em></li>
</xsl:template> </xsl:stylesheet>
针对 example.htm的修改
第16行替换为
xmlhttp.open("get", "employees2.xslt", false);
第23 - 28替换为下面代码
processor.setParameter(null, "message", "Hello World!"); var fragment = processor.transformToFragment(xmldom, document);
var div = document.getElementById("divResult"); div.appendChild(fragment);
我们看运行后的结果:通过转换将模板中的 $message变量替换成了我们传入的参数"Hello World!"
<div id="divResult"><ul>
<li>Nicholas C. Zakas, <em>Software Engineer</em></li>
<li>Jim Smith, <em>Salesperson</em></li>
</ul>
<p>Message: Hello World!</p>
</div>
还有两个与参数有关的方法,getParamenter()和removeParamenter(),分别用于取得和一处当前参数的值。这两个方法都要接受命名空间参数和参数内部i名称。例如
var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom);
processor.setParameter(null, "message", "Hello World!");
alert(processor.getParaeter(null,"message")); //输出 “Hello World!"
processor.removeParameter(null,"message");
var fragment = processor.transformToFragment(xmldom, document);
这两个方法并不常用。
2.重置处理器
每个XSLTProcessor 的实例都可以重用,以便使用不同的XSLT样式表执行不同的转换。重置处理器时要调用reset()方法,这个方法会从处理器中移除所有的参数和样式表。然后,你就可以再次调用importStylesheet(),以加载不同的XSLT样式表,如下面的例子
var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom); //执行转换 processor.reset();
processor.importStylesheet(xsltdom2); //在执行转换
在需要基于多个样式表进行转换时,重用一个XSLTProcessor可以节省内存。
JaveScript 中使用 XSLT转换XML文档的更多相关文章
- C#操作Xml:XSLT语法 在.net中使用XSLT转换xml文档示例
XSL即可扩展的样式表文件. 可以格式化xml的显示,也可以将xml转换成需要的另一种格式. 学习XSL必须熟悉XPath.XSL和XPath一样简单强大,容易学习. 1. XSL既然可以格式化xml ...
- PHP中利用DOM创建xml文档
DOM创建xml文档 用dom创建如下文档: <booklist> <book id="1"> <title>天龙八部</title> ...
- Anakia 转换xml文档为其他格式
一.简介 Anakia 使用JDOM 和Velocity将XML文档转换为特定格式的文档 二.解析xml文档方法 1.DOM java jdk,xml-api.jar 需要加载整个xml文档来构建层次 ...
- c#使用XSLT将xml文档转换为html文档
需要引用下面的命名空间: using System.Xml; using System.Xml.Xsl; 方法实现: public static string ConvertXML(XmlDocume ...
- 详解xml文件描述,读取方法以及将对象存放到xml文档中,并按照指定的特征寻找的方案
主要的几个功能: 1.完成多条Emp信息的XML描述2.读取XML文档解析Emp信息3.将Emp(存放在List中)对象转换为XML文档4.在XML文档中查找指定特征的Emp信息 dom4j,jaxe ...
- freeMarker(十三)——XML处理指南之揭示XML文档
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 前言 尽管 FreeMarker 最初被设计用作Web页面的模板引擎, ...
- 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目
小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...
- 源生API解析XML文档与dom4j解析XML文档
一.XML语言 XML是一种可扩展的标记语言,是一种强类型的语言,类似HTML(超文本标记语言,是一种弱类型的语言).XML是一种通用的数据交换格式(关系型数据库),综上所诉:XML可以传输数据,也可 ...
- 转 创建 JavaScript XML 文档注释
http://www.cnblogs.com/chenxizhang/archive/2009/07/12/1522058.html 如何:创建 JavaScript XML 文档注释 Visual ...
随机推荐
- python装饰器1:函数装饰器详解
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...
- [JavaScript] 前端模块编程实现
前端模块化 前端早期写代码都是全局变量满天飞,这种情况会造成全局命名空间污染,变量冲突等问题 var a = 1; var b = 2; function c(){} function d(){} 后 ...
- 结构型---享元模式(Flyweight Pattern)
引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严 ...
- 在.net中怎么解析json串 [Error reading JObject from JsonReader. Current JsonReader item is not an obj]
编辑时间:2017-05-10,增加一种转化list的方法 一.以前知道一种解析json串的方法,觉得有点麻烦.就从别的地方搜到了另一种 string json = vlt.getlist(); JO ...
- Android Studio 基础控件使用
TextView android:gravity="center" //文字对其方式 top bottom left right center android:textColor= ...
- App测试流程及测试点(个人整理版)
1 APP测试基本流程 1.1流程图 1.2测试周期测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间.正式测试前先向主 ...
- Josephu(约瑟夫)问题解析
Josephu问题为: 设置编号为1,2,3,......n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1看是报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人出 ...
- python文件
目录 1. 文件的概念 1.1 文件的概念和作用 1.2 文件的存储方式 2. 文件的基本操作 2.1 操作文件的套路 2.2 操作文件的函数/方法 2.3 read 方法 -- 读取文件 2.4 打 ...
- 不容易系列之一(hdu1465)错排+递推
不容易系列之一 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- vue(三)-父子组件通信
原因 : Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. props 父组件给子组件传递数据 props:作用是父组件给 ...