XSLT学习一——元素上
XSLT是XSL(Extensible Stylesheet Language)转换,是XML文档转换语言,通过将XML文档转换成能够显示的格式,以达到指定样式的目的。XSLT是XSL的一部份,它是XML的一种应用,指定将一篇XML文档转换成另一种XML文档的规则。XSLT文档即是一篇XML文档,也是一个样式表,里面包含一系列的模板。XSLT处理器对输入XML文档中的元素和样式表中的模板进行比较,如果匹配,则将该模板的内容写入一个输出树中。完成处理后,将输出树串行化成一篇XML文档或其它格式的文档,如HTML。
1、根元素
xsl:stylesheet根元素,XSLT也是一个XML文档,该文档的根元素就是xsl:stylesheet.XSLT元素都属于名称空间xmlns:xsl=http://www.w3.org/1999/XSL/Transform。stylesheet至少指定smlns和version属性。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
</xsl:stylesheet>
transform跟xsl:stylesheet一样
<?xml version="1.0" encoding="utf-8"?>
<transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
</transform>
2、顶级元素
xsl:attribute-set元素可创建命名的属性集。该属性集(attribute-set)可作为整体应用到输出文档。
<xsl:attribute-set name="font">
<xsl:attribute name="fname">Arial</xlt:attribute>
<xsl:attribute name="size">14px</xlt:attribute>
<xsl:attribute name="color">red</xlt:attribute>
</xsl:attribute-set>
xsl:attribute-set有两个属性name是必需属性,use-attribute-sets是可选属性,在该属性集中使用的其它属性集的列表,由空格分隔。
xsl:decimal-foramt元素定义当通过format-number()函数把数字转换味字符时,所要使用的字符和符号。
属性 | 值 | 描述 |
---|---|---|
name | name | 可选。为此格式规定名称。 |
decimal-separator | char | 可选。规定小数点字符。默认是 "."。 |
grouping-separator | char | 可选。规定千的分隔字符。默认是 ","。 |
infinity | string | 可选。规定用来表示无穷大的字符串。默认是 "Infinity"。 |
minus-sign | char | 可选。规定表示负数的字符。默认是 "-"。 |
NaN | string | 可选。规定当值不是数字时使用的字符串。默认是 "NaN"。 |
percent | char | 可选。规定百分比符号的字符。默认是 "%"。 |
per-mille | char | 可选。规定千分号的字符。默认是 "‰"。 |
zero-digit | char | 可选。规定数字 0 的字符。默认是 "0"。 |
digit | char | 可选。规定字符,该字符用于指示需要使用数字的地方。默认是 #。 |
pattern-separator | char. | 可选。规定字符,该字符用于分隔格式模式中的正负次模式。默认是 ";"。 |
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xlt="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:decimal-format name="euro" decimal-separator="," grouping-separator="."/>
<xsl:template match="/">
<xsl:value-of select="format-number(26825.8, '#.###,00', 'euro')"/>
</xsl:template>
</xsl:stylesheet>
输出结果为:26.825,80
xsl:import是对其他xlst的导入,通过import在该xslt使用其他xlst的内容,可以做到xslt的重用。
<?xml version="1.0" encoding="utf-8"?>另一个xslt文件:
<xsl:stylesheet xmlns:xlt="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:import href="ImportXSLT.xslt"/>
<xsl:template match="/">
<h2>Import Test</h2>
<xlt:call-template name="ImportName"/>
</xsl:template>
</xlt:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/" name="ImportName">
<div>Imported Content</div>
</xsl:template>
</xsl:stylesheet>
输出结果为:<h2>Import Test</h2>
<div>Imported Content</div>
xsl:include元素是把一个xslt中的内容包含到另一个样式表中。被包含的样式表(included style sheet)拥有与包含的样式表(including style sheet)相同的优先级。
<?xmlversion="1.0" encoding="utf-8"?>
<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:templatematch="/">
<xsl:for-eachselect="COLLECTION/BOOK">
<xsl:apply-templatesselect="TITLE"/>
<xsl:apply-templatesselect="AUTHOR"/>
<xsl:apply-templatesselect="PUBLISHER"/>
<BR/>
<!--add this-->
</xsl:for-each>
</xsl:template>
<xsl:templatematch="TITLE">
<DIVSTYLE="color:blue">
Title: <xsl:value-ofselect="."/>
</DIV>
</xsl:template>
<xsl:includehref="IncludeXSLT.xslt" />
</xsl:stylesheet>
被包含的XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="TITLE">
Title - <xsl:value-of select="."/><BR/>
</xsl:template>
<xsl:template match="AUTHOR">
Author - <xsl:value-of select="."/><BR/>
</xsl:template>
<xsl:template match="PUBLISHER">
Publisher - <xsl:value-of select="."/><BR/>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8" ?>
<COLLECTION>
<BOOK>
<TITLE>Lover Birds</TITLE>
<AUTHOR>Cynthia Randall</AUTHOR>
<PUBLISHER>Lucerne Publishing</PUBLISHER>
</BOOK>
<BOOK>
<TITLE>The Sundered Grail</TITLE>
<AUTHOR>Eva Corets</AUTHOR>
<PUBLISHER>Lucerne Publishing</PUBLISHER>
</BOOK>
<BOOK>
<TITLE>Splish Splash</TITLE>
<AUTHOR>Paula Thurman</AUTHOR>
<PUBLISHER>Scootney</PUBLISHER>
</BOOK>
</COLLECTION>
取消包含:
<!--<xsl:include href="IncludeXSLT.xslt" />-->
结果为:
说明被包含的xslt跟包含的xlst有同等的优先权。可以替换包含xslt的定义。
xsl:key元素声明一个命名的键,即为XML文档中指定的元素分配的名称和值对,此键通过key()函数在xslt中使用,可以优先地在复杂的XML访问分配的元素.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="preg" match="person" use="@type"/>
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="key('preg','1')">
<p>
Type: <xsl:value-of select="@type"/><br />
Name: <xsl:value-of select="@name"/>
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8" ?>
<persons>
<person name="Tarzan" type="1"/>
<person name="Donald" type="2"/>
<person name="Dolly" type="3"/>
<person name="David" type="1"/>
</persons>
xsl:namespace-alias元素用于在输出中把样式表中的命名空间替换为不同的命名空间,也就是使用其他前缀替换于给定命名空间关联的前缀。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wxsl="http://www.w3school.com.cn/w3style.xsl">
<xsl:namespace-alias stylesheet-prefix="wxsl" result-prefix="xsl"/>
<xsl:template match="/">
<wxsl:stylesheet>
<xsl:apply-templates/>
</wxsl:stylesheet>
</xsl:template>
</xsl:stylesheet>
xsl:output元素定义输出文档的格式。
属性 | 值 | 描述 |
---|---|---|
method |
|
可选。定义输出的格式。默认是 XML。Netscape 6 仅支持 "html" 和 "xml"。 |
version | string | 可选。设置输出格式的 W3C 版本号。(仅在 method="html" or method="xml" 时使用)。 |
encoding | string | 可选。设置输出中编码属性的值。 |
omit-xml-declaration |
|
可选。 "yes" 规定在输出中省略 XML 声明 (<?xml...?>)。 "no" 规定应在输出中包含 XML 声明。默认是 "no"。 |
standalone |
|
可选。规定 XSLT 处理器是否应输出独立文档声明;该值必须为 yes 或 no。默认是 "no"。Netscape 6 不支持该属性。 |
doctype-public | string | 可选。规定 DTD 中要使用的公共标识符。即输出中 DOCTYPE 声明的 PUBLIC 属性的值。 |
doctype-system | string | 可选。规定 DTD 中要使用的系统标识符。即输出中 DOCTYPE 声明的 SYSTEM 属性的值。 |
cdata-section-elements | namelist | 可选。一个空格分隔的元素列表,这些元素的文本内容应作为 CDATA 部分来输出。 |
indent |
|
可选。在输出结果树时是否要增加空白;该值必须为 yes 或 no。Netscape 6 不支持该属性。 |
media-type | string | 可选。定义输出的 MIME 类型(数据的媒体类型)。默认是 "text/xml"。Netscape 6 不支持该属性。 |
如果没有 <xsl:output> 元素或没有 <xsl:output> 元素指定了 method 属性的值,应使用默认的输出方法。
xsl:param元素用于声明局部或全局参数。如果在XSLT内声明参数,就是局部参数,如果作为顶层元素来声明,就是全局参数,这跟许多编程语言类似。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="xx">
<html>
<body>
<xsl:call-template name="show_title">
<xsl:with-param name="title" />
</xsl:call-template>
</body>
</html>
</xsl:variable>
<xsl:template name="show_title" match="/">
<xsl:param name="title" />
<xsl:for-each select="catalog/cd">
<p>
Title: <xsl:value-of select="$title" />
</p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
xsl:preserve-space元素用于定义保留空白的元素;xsl:strip-space元素用于定义删除空白的元素。保留空白是默认的设置,所以只有当使用xsl:stript-space元素时才有必要使用xsl:preserve-space元素。
xsl:template元素包含了当匹配指定节点是要应用的规则。match属性用于把XSLT关联到某个XML元素。
<?xml version="1.0" encoding="utf-8"?>
<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>
xsl:variable元素用于声明局部或全局的变量。如果被声明为顶层元素,则该变量是全局的,如果是在内部,则是局部的。一旦设置啦变量的值,将无法修改变量的值。
<xsl:variable name="color" select="'red'"/>
<xsl:variable name="size">25px</xsl:variable>
xsl:variable的作用是定义一个值可以多次使用,还有就是根据条件设置变量的值。
<xsl:variable name="typename">
<xsl:choose>
<xsl:when test="@type=1">
类型一
</xsl:when>
<xsl:when test="@type=2">
类型二
</xsl:when>
</xsl:choose>
</xsl:variable>
以上是xslt的根元素和顶级元素,指令元素到下一篇。