1 XSLT知识点
1.1 入门学习网站
http://www.w3school.com.cn/xsl/index.asp
1.2 函数
XSLT与XPath,XQuery使用相同的函数库。
http://www.w3school.com.cn/xpath/xpath_functions.asp
1.3 常用的XSLT元素
1.3.1 <xsl:template>
XSL 样式表由一个或多套被称为模板(template)的规则组成。每个模板含有当某个指定的节点被匹配时所应用的规则。
1.3.2 <xsl:value-of>
<xsl:value-of> 元素用于提取某个选定节点的值。如:
<xsl:value-of select="/Data/Books/Book[position()=$pos]/*[name()=$fld]"/>
1.3.3 <xsl:for-each>
<xsl:for-each> 元素允许您在 XSLT 中进行循环。实现数据遍历。类似于C#的foreach关键字。
1.3.4 <xsl:if>
<xsl:if> 元素用于放置针对 XML 文件内容的条件测试。类似于C#的if关键字,但是在xslt中没有else分支。
<xsl:if test=".>85">
<xsl:attribute name="style">color:red</xsl:attribute>
</xsl:if>
<xsl:if test=".<60">
<xsl:attribute name="style">color:blue</xsl:attribute>
</xsl:if>
1.3.5 <xsl:sort>
如需对结果进行排序,只要简单地在 XSL 文件中的 <xsl:for-each> 元素内部添加一个 <xsl:sort> 元素。如:
<xsl:for-each select="catalog/cd">
<xsl:sort select="artist"/>
<tr>
<td>
<xsl:value-of select="title"/>
</td>
<td>
<xsl:value-of select="artist"/>
</td>
</tr>
</xsl:for-each>
1.3.6 <xsl:choose>
XSLT <xsl:choose> 元素用于结合 <xsl:when> 和 <xsl:otherwise> 来表达多重条件测试。
<xsl:choose>
<xsl:when test=".>85">优秀</xsl:when>
<xsl:when test=".>70">一般</xsl:when>
<xsl:when test=".>60">合格</xsl:when>
<xsl:otherwise>不合格</xsl:otherwise>
</xsl:choose>
1.3.7 <xsl:apply-templates>
<xsl:apply-templates> 元素可把一个模板应用于当前的元素或者当前元素的子节点。假如我们向 <xsl:apply-templates> 元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素。我们可以使用 select 属性来规定子节点被处理的顺序。
1.3.8 <xsl:output>
设置xslt的转换输出,如格式html,xml等,编码utf8,gb2312等。
2 HTML与XSLT
2.1 外部样式表引用
在<head></head>标签之间放置如:
<head>
<link type="text/css" rel="stylesheet" href="../HtmlTemplate/common.css" />
</head>
2.2 外部脚本库引用
可以放置到<head></head>及<body></body>中。如:
<script src="../HtmlTemplate/common.js" type="text/javascript"></script>
2.3 XSLT内部脚本
在XSLT内部编写脚本时,需要添加<![CDATA[]]>:
<head>
<link type="text/css" rel="stylesheet" href="../HtmlTemplate/common.css" />
<script src="../HtmlTemplate/common.js" type="text/javascript"></script>
<script language="JavaScript">
<![CDATA[
function showSelected() {
var ids = [];
var boxes = tblList.getElementsByTagName("input");
for (var i = 1; i < boxes.length; i++) {
if (boxes[i].checked)
ids.push(boxes[i].bookId);
}
document.getElementById("hdIds").value = ids.toString();
alert(ids);
}
]]>
</script>
</head>
3 XML与XSLT
现在各种主流浏览器都支持XML到XSLT的转换。可以利用XSLT实现XML从一种结构到另一种结构的转换。
在XML文件的开头可以添加指令生命要引用的XSLT文件。这样浏览器就能够根据这个路径去加载XSLT去执行转换,并将结果显示给用户。
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='../HTMLTemplate/DemoComplexList.xslt'?>
4 .Net与XSLT
在.Net中通常采用XsltCompiledTransform类来实现转换,其Transform方法支持很多重载,可以是文件,流,或者读写器等。如:
private static string thruHtml(XDocument xDoc, string xsltFile)
{
string basePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xsltPath = string.Format("{0}""HTMLTemplate""{1}", basePath, xsltFile);
string htmlPath = string.Format("{0}""temp""{1}.htm", basePath, Guid.NewGuid());
using (FileStream fs = new FileStream(htmlPath, FileMode.Create))
{
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(xsltPath);
XmlReader xr = xDoc.CreateReader();
transform.Transform(xr, null, fs);
}
return htmlPath;
}
5 JavaScript与XSLT
利用XMLDocument对象模型实现转换,如下代码在IE下运行:
<html>
<head>
<title>CD Catalog</title>
</head>
<body>
<script type="text/javascript">
// Load XML
var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("cdcatalog.xml");
// Load XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM");
xsl.async = false;
xsl.load("cdcatalog.xsl");
// Transform
document.write(xml.transformNode(xsl));
</script>
</body>
</html>