引言

有时我们想看下系统生成的XML文件(如XML格式的Project文件),如果文件结构简单,我们浏览器看起来还比较方便,但是随着XML schema复杂后就变得让人头疼啦,单独写一个程序去做展现又有点小题大做。这时XSL就用体现它的价值啦,当然XSL不只是为了显示,更多的目的是从一个格式生成另个一格式的XML或者其他格式的文件。本文只说说格式化。

过程中遇到的问题解决方法

参看XLT格式化XML那点事(二)

效果图

XSL常用元素

xsl:template定义匹配节点的转换模板,属性match=”xpath expression”用来定义模板匹配的元素

如下定义匹配根节点的模板

<xsl:template match=”/”>

</xsl:template>

xsl:for-each循环显示select=”xpath expression”选择节点的转换 (类似编程语言中的foreach语句),

如下示例,选择了pets下面的子元素,并循环显示子元素的几点名字:

<xsl:for-each select=”/pets/*”>

<xsl:value-of select=”name()”/>

</xsl:for-each>

xsl:if 元素条件显示节点(类似编程语言中的if语句)注意小于号大于号要分别用&lt;和&gt;替代

<xsl:if test=”@weight &lt; 10”>

<i>its weight is less than 10 km</i>

</xsl:if>

xsl:choose 多分支条件显示 (类似编程语言中的switch语句)

<xsl:choose >

<xsl:when test=”name() = ‘pig’”>

<i>this is a pig</i>

</xsl:when>

<xsl:otherwise>

  <i>this is not a pig</i>

</xsl:otherwise>

</xsl:choose>

xsl:value-of 显示选择节点或者属性的值

选择子节点price

<xsl:value-of select=”pets/*/price”/>

选择属性weight

<xsl:value-of select=”pets/*/@weight”/>

xsl:attribute 构造xml节点的属性

用来向节点添加属性,例如:

<font>

<xsl:attribute name=”color”><xsl:value-of select=”pets/*/@color”/></xsl:attribute>

</font>

将输出<font color=”red”></font>

xsl:apply-templates 应用模板

如果xml文件结构比较复杂,可以定义多个template,然后使用<xsl:apply-templates>标签应用模板,xsl:apply-templates 可以指定属性select=”xpath”来选择应用的模板,或者不指定select表示选择当前节点的模板。

XSL所有元素

元素 描述 IE N
apply-imports 应用来自导入样式表中的模版规则。 6.0  
apply-templates 向当前元素或当前元素的子元素应用模板。 5.0 6.0
attribute 向元素添加属性。 5.0 6.0
attribute-set 创建命名的属性集。 6.0 6.0
call-template 调用一个指定的模板。 6.0 6.0
choose 与<when>以及<otherwise>协同使用,来表达多重条件测试。 5.0 6.0
comment 在结果树中创建注释节点。 5.0 6.0
copy 创建当前节点的一个备份(无子节点及属性)。 5.0 6.0
copy-of 创建当前节点的一个备份(带有子节点及属性)。 6.0 6.0
decimal-format 定义当通过 format-number() 函数把数字转换为字符串时,所要使用的字符和符号。 6.0  
element 在输出文档中创建一个元素节点。 5.0 6.0
fallback 假如处理器不支持某个XSLT元素,规定一段备用代码来运行。 6.0  
for-each 遍历指定的节点集中的每个节点。 5.0 6.0
if 包含一个模板,仅当某个指定的条件成立时应用此模板。 5.0 6.0
import 用于把一个样式表中的内容倒入另一个样式表中。 6.0 6.0
include 把一个样式表中的内容包含到另一个样式表中。 6.0 6.0
key 声明一个命名的键。 6.0 6.0
message 向输出写一条消息(用于错误报告)。 6.0 6.0
namespace-alias 把样式表中的命名空间替换为输出中不同的命名空间。 6.0  
number 测定当前节点的整数位置,并对数字进行格式化。 6.0 6.0
otherwise 规定 <choose> 元素的默认动作。 5.0 6.0
output 定义输出文档的格式。 6.0 6.0
param 声明一个局部或全局参数。 6.0 6.0
preserve-space 用于定义保留空白的元素。 6.0 6.0
processing-instruction 生成处理指令节点。 5.0 6.0
sort 对结果进行排序。 6.0 6.0
strip-space 定义应当删除空白字符的元素。 6.0 6.0
stylesheet 定义样式表的根元素。 5.0 6.0
template 当指定的节点被匹配时所应用的规则。 5.0 6.0
text 通过样式表生成文本节点。 5.0 6.0
transform 定义样式表的根元素。 6.0 6.0
value-of 提取选定节点的值。 5.0 6.0
variable 声明局部或者全局的变量。 6.0 6.0
when 规定 <choose> 元素的动作。 5.0 6.0
with-param 规定需被传入某个模板的参数的值。 6.0 6.0

XSL引入方式

IE浏览器支持直接在XML中直接引入XSL文件

<?xml-stylesheet type="text/xsl" href="icoreNested.xsl"?>

Chorme浏览器不能直接加载本地XSL文件

参考Can Chrome be made to perform an XSL transform on a local file

<html>
<head>
<script>
function loadXMLDoc(filename)
{
var progressBar = document.getElementById("p");
if (window.ActiveXObject)
{
xhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
else
{
xhttp = new XMLHttpRequest();
}
xhttp.open("GET", filename, false);//Synchronous loadXMLDoc try {
xhttp.onprogress = function(pe) {
if(pe.lengthComputable) {
progressBar.max = pe.total
progressBar.value = pe.loaded
}
}
xhttp.onloadend = function(pe) {
progressBar.value = pe.loaded
}
} catch(err) {} // Helping IE11
xhttp.send();
return xhttp.responseXML;
} function displayResult()
{
xml = loadXMLDoc("cdcatalog.xml");
xsl = loadXMLDoc("cdcatalog.xsl");
// code for IE
if (window.ActiveXObject || xhttp.responseType == "msxml-document")
{
ex = xml.transformNode(xsl);
document.getElementById("example").innerHTML = ex;
}
// code for Chrome, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToFragment(xml, document);
document.getElementById("example").appendChild(resultDocument);
}
}
</script>
</head>
<body onload="displayResult()">
<h2>Content as Follow:</h2> <progress id=p style="width=100%"></progress> <div id="example" />
</body>
</html>

源码

源码下载

参考

Can Chrome be made to perform an XSL transform on a local file?

嵌套的可折叠块

XML通过XSL格式化的那点事(XML到自定义节点折叠显示)的更多相关文章

  1. xml和xsl配合使用实例

    找到一个实际应用的例子,是英语统考打印准考证的实例,关于xml和xsl配合使用的. 下面看看xml文档 <?xml version='1.0' encoding='utf-8' ?> &l ...

  2. XML、XSL、XSLT、DTD、XSD的区别

    前言: 在众神的努力之下,js已经可以跨出浏览器走向不同的领域了 也因为这个,对前端工程师的要求也不仅仅是会写写h5页面做交互.前端涉及的领域越来越广,对开发人员对素质能力要求越高. 以前因设备不同导 ...

  3. MyEclipse/Eclipse中XML文件的格式化配置

    Eclipse中XML文件的格式化配置 MyEclipse: 这一步的配置是使格式化的效果为控件的每个属性配置占一行.进入 Window/Preferences,展开到 XML/XML Resourc ...

  4. eclipse的格式化规则(即format.xml文件).

    eclipse的格式化规则(即format.xml文件) 下面是文件内容 <?xml version="1.0" encoding="UTF-8" sta ...

  5. XML XSD XSL区别与联系

    XML: XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准 ...

  6. htm,html,xhtml,xml,xsl,dhtml,shtm和shtml的区分

    介绍一下htm,html,xhtml,xml,shtml的区分,以下内容来自百度后的知识整理. HTML和htm: HTML(Hypertext Markup Language)超文本传输语言,是ww ...

  7. 【解决方案】cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One of '{"http://java.sun.com/xml/ns/javaee":run-as, "http://java.sun.com/xml/ns/javaee":security-role-r

    [JAVA错误] cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One o ...

  8. 项目中运行报错: Loading XML bean definitions from class path resource [applicationContext.xml]

    记录一下: org.springframework.context.support.AbstractApplicationContext prepareRefresh Refreshing org.s ...

  9. 【转】循环递归遍历XML文档或按某要求遍历XML文档

    <?xml version="1.0" encoding="UTF-8"?> <catalog> <cd> <titl ...

随机推荐

  1. Python_Day_04 set方法总结

    set(集合) 直接创建一个空集合 set_empty = set() print(set_empty) # set() 根据参数创建 # 根据参数 set_argument = set(42,',' ...

  2. .NET 扩展方法 (一)

    我还记得刚刚学编程的时候,老师经常会提到一句话:注意空指针.所以经常在某些“入口”位置,进行代码校验,空指针的判断就是其中的一项工作. string类型作为常用的数据类型,它在项目中出现的机率极高,所 ...

  3. C# GDI+ 处理文本的两个小技巧

    private void button7_Click(object sender, EventArgs e) { Graphics g = this.CreateGraphics(); g.FillR ...

  4. Web API与文件操作

    前段时间,一直有练习ASP.NET MVC与Web API交互,接下来,Insus.NET再做一些相关的练习,Web API与文件操作,如POST文件至Web API,更新或是删除等. 不管怎样,先在 ...

  5. case break结构与return的有关要点

    //确认事件 private void cmd_ok_Click(object sender, EventArgs e) { //客户名称是否为空 if (txt_banhao.Text.TrimEn ...

  6. csharp:ASP.NET SignalR

    http://signalr.net/ https://github.com/SignalR/SignalR http://www.asp.net/signalr http://www.cnblogs ...

  7. Atitit.ide eclipse编译速度慢的解决

    Atitit.ide eclipse编译速度慢的解决 以为是jar的体积与数量,貌似无关.. Err java的数量,貌似无关 Java的数量,关系不大... 最终原因:show>>pro ...

  8. C程序范例(1)——学生管理系统”数组“实现

    1.在写程序之前,我想告诉大家,这个程序初学者很可能可能看不懂,但是这很正常,因为这是我在学习完C语言之后写的.所以大家好好学习吧! 由于这是在我大一刚学到数组时编写的程序,有许多冗余的部分,但当时做 ...

  9. PHP7 redis扩展安装

    1.安装redis (1)下载:https://github.com/phpredis/phpredis/tree/php7 或下载http://pan.baidu.com/s/1i5DFrjn用sa ...

  10. iOS-私有API与runtime

    转载:http://www.jianshu.com/p/6167b9ce7af8 序 有朋友在做类似iTool的功能,跟我聊起来,这几天闲,就写了一个demo,不是正经做这个,还很粗略,具体干货诸位等 ...