XSLT
声明样式
文档声明
根据 W3C 的 XSLT 标准,声明 XSL 样式表的正确方法是:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
或者:
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
一定要声明XSL样式,上面两套方法是等价的。
如需访问 XSLT 的元素、属性以及特性,我们必须在文档顶端声明 XSLT 命名空间。
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
指向了官方的 W3C XSLT 命名空间
。如果您使用此命名空间,就必须包含属性version="1.0"
。
XML转HTML
定义XML到HTML的转换规则:
-
xsl:template
定义一个模板。 -
xsl:for-each
迭代。 -
xsl:value-of
取值。
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method='html' version='1.0' encoding='UTF-8' indent='yes'/> <xsl:template match="/"> <!-- XPath匹配整个文档 --> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th align="left">Title</th> <th align="left">Artist</th> </tr> <xsl:for-each select="catalog/cd"> <!-- 迭代 catalog/cd --> <tr> <td><xsl:value-of select="title"/></td> <!-- 选定节点 --> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
数据XML中引入XLS:
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> <catalog> <cd> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <country>USA</country> <company>Columbia</company> <price>10.90</price> <year>1985</year> </cd> <cd> <title>Hide your heart</title> <artist>Bonnie Tyler</artist> <country>UK</country> <company>CBS Records</company> <price>9.90</price> <year>1988</year> </cd> </catalog>
查看效果:../code/xslt/01/cdcatalog.xml
元素介绍
xsl:for-each迭代:
可以过滤结果:
通过在<xsl:for-each>
元素中添加一个选择属性的判别式,我们也可以过滤从 XML 文件
输出的结果。
<xsl:for-each select="catalog/cd[artist='Bob Dylan']">
合法的过滤运算符:
-
=
:等于 -
!=
:不等于 -
<
:小于 -
>
:大于
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd[artist='Bob Dylan']"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
xsl:sort 排序
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <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> </table> </body> </html> </xsl:template> </xsl:stylesheet>
xsl:if 判断
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <xsl:if test="price > 10"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:if> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
xsl:choose 选择
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <xsl:choose> <xsl:when test="price > 10"> <td bgcolor="#ff00ff"> <xsl:value-of select="artist"/> </td> </xsl:when> <xsl:otherwise> <td><xsl:value-of select="artist"/></td> </xsl:otherwise> </xsl:choose> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
xsl:apply-templates 使用当前元素
<xsl:apply-templates>
元素可把一个模板应用于当前的元素或者当前元素的子节点。
假如我们向<xsl:apply-templates>
元素添加一个select
属性,此元素就会仅仅处理与
属性值匹配的子元素。我们可以使用select
属性来规定子节点被处理的顺序。
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="cd"> <p> <xsl:apply-templates select="title"/> <xsl:apply-templates select="artist"/> </p> </xsl:template> <xsl:template match="title"> Title: <span style="color:#ff0000"><xsl:value-of select="."/></span> <br /> </xsl:template> <xsl:template match="artist"> Artist: <span style="color:#00ff00"><xsl:value-of select="."/></span> <br /> </xsl:template> </xsl:stylesheet>
使用JavaScritp
和html一样,在模板里指定JS就可以了:
function showMassage(msg) { alert(msg); }; showMassage("hello");
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <script type="text/javascript" src="cdcatalog.js"></script> </head> <body> <h2>My CD Collection</h2> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="cd"> <p> <xsl:apply-templates select="title"/> <xsl:apply-templates select="artist"/> </p> </xsl:template> <xsl:template match="title"> Title: <span style="color:#ff0000"> <xsl:value-of select="."/></span> <br /> </xsl:template> <xsl:template match="artist"> Artist: <span style="color:#00ff00"> <xsl:value-of select="."/></span> <br /> </xsl:template> </xsl:stylesheet>
参考手册
XSL常用元素
元素 | 描述 |
---|---|
apply-imports | 应用来自导入样式表中的模版规则。 |
apply-templates | 向当前元素或当前元素的子元素应用模板。 |
attribute | 向元素添加属性。 |
attribute-set | 创建命名的属性集。 |
call-template | 调用一个指定的模板。 |
choose | 与<when>以及<otherwise>协同使用,来表达多重条件测试。 |
comment | 在结果树中创建注释节点。 |
copy | 创建当前节点的一个备份(无子节点及属性)。 |
copy-of | 创建当前节点的一个备份(带有子节点及属性)。 |
decimal-format | 定义当通过 format-number() 函数把数字转换为字符串时, |
所要使用的字符和符号。 | |
element | 在输出文档中创建一个元素节点。 |
fallback | 假如处理器不支持某个XSLT元素,规定一段备用代码来运行。 |
for-each | 遍历指定的节点集中的每个节点。 |
if | 包含一个模板,仅当某个指定的条件成立时应用此模板。 |
import | 用于把一个样式表中的内容倒入另一个样式表中。 |
include | 把一个样式表中的内容包含到另一个样式表中。 |
key | 声明一个命名的键。 |
message | 向输出写一条消息(用于错误报告)。 |
namespace-alias | 把样式表中的命名空间替换为输出中不同的命名空间。 |
number | 测定当前节点的整数位置,并对数字进行格式化。 |
otherwise | 规定 <choose> 元素的默认动作。 |
output | 定义输出文档的格式。 |
param | 声明一个局部或全局参数。 |
preserve-space | 用于定义保留空白的元素。 |
processing-instruction | 生成处理指令节点。 |
sort | 对结果进行排序。 |
strip-space | 定义应当删除空白字符的元素。 |
stylesheet | 定义样式表的根元素。 |
template | 当指定的节点被匹配时所应用的规则。 |
text | 通过样式表生成文本节点。 |
transform | 定义样式表的根元素。 |
value-of | 提取选定节点的值。 |
variable | 声明局部或者全局的变量。 |
when | 规定 <choose> 元素的动作。 |
with-param | 规定需被传入某个模板的参数的值。 |
详细:http://www.w3school.com.cn/xsl/xsl_w3celementref.asp
XSLT常用函数
XSLT 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、 节点和 QName 操作、序列操作、逻辑值,等等等等。
XSLT 函数的命名空间的 URI 是:http://www.w3.org/2005/02/xpath-functions
函数命名空间的默认前缀是fn
。
提示:函数在被调用时常带有fn:
前缀,比如fn:string()
。不过,既然fn:
是
命名空间的默认前缀,那么在被调用时,函数的名称不必使用前缀。
您可以在我们的 XPath 教程中访问所有内建的 XSLT 2.0 函数参考。
此外,在此列出了内建的 XSLT 函数:
名称 | 描述 |
---|---|
current() | 返回当前节点作为唯一成员的节点集。 |
document() | 用于访问外部 XML 文档中的节点。 |
element-available() | 检测 XSLT 处理器是否支持指定的元素。 |
format-number() | 把数字转换为字符串。 |
function-available() | 检测 XSLT 处理器是否支持指定的函数。 |
generate-id() | 返回唯一标识指定节点的字符串值。 |
key() | 检索以前使用 <xsl:key> 语句标记的元素。 |
node-set | 将树转换为节点集。产生的节点集总是包含单个节点并且是树的根节点。 |
system-property() | 返回系统属性的值。 |
unparsed-entity-uri() | 返回未解析实体的 URI。 |
详细: http://www.w3school.com.cn/xsl/xsl_functions.asp