好久没有学习了。这是最近接触的一些模板学习笔记。
xsl是将xml转化为HTML的一种模板。通过XPath来获取xml的节点路径等信息。工作原理为:使用XPath来匹配xml中定义的部分,找到之后将该部分转化为指定的结果文档。
直接进入主题:
stylesheet
元素以及transform
元素
类似于HTML文件一样,需要对文档进行声明,其中以下两种方式均可:代码如下:
<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">
由于实例会涉及到xml文档内容,将以以下xml文档为例进行描述:
<DOCUMENT>
<docid>xml001</docid>
<item>
<key>xmlshili</key>
<classId>xsl001</classId>
<display doc_num="3" total_num="3">
<name annotation="1">
<![CDATA[gjw]]>
</name>
<subitem index_level="1">
<key>性别</key>
<value>男</value>
</subitem>
<subitem>
<key>年龄</key>
<value>23</value>
</subitem>
<subitem>
<key>爱好</key>
<value></value>
</subitem>
</display>
<type>xml</type>
</item>
</DOCUMENT>
template
元素
该元素用于声明一个模板,其所包含的属性有:
name
:为模板定义名称,可选属性(若省略该属性,则match
为必选);
match
:该模板的匹配模式,可选属性(若省略该属性,则name
为必选);
mode
:为模板规定模式,可选属性;
priority
:用于表示模板的优先级,可选属性。
该元素实例如下代码所示:
<xsl:template name="css">
<xsl:template mode="big"><link href="http://www.123456.com/gjw/xmlshili.css" rel="stylesheet" type="text/css" /></xsl:template>
<link href="http://www.123456.com/gjw/shili.css" rel="stylesheet" type="text/css" />
</xsl:template>
上面所声明的template
模块,可通过apply-templates
和call-template
来展示。
apply-templates
元素
该元素用于将先前声明的template模块以及当前模板的子节点进行展示,其包含两个属性:
select
:可选属性,选择想要选中的节点;
mode
:可选属性,通过声明的mode
进行区分节点。
例如:
<xsl:template name="message">
<h1><xsl:apply-templates select="css" mode="big"/></h1>
</xsl:template>
上述代码展示了属于message
的mode
为“big”的css子节点
call-template
元素
该元素指的是调用指定的模板,其包含一个必选属性:
name
:必选属性,指定被调用的模板名称。
实例代码如下所示:
<xsl:call-template name="css"/>
import
元素
该元素用于把外部的样式引入进来,包含属性为:
href
:必选参数,用于指定导入样式的URL路径。
apply-imports
元素
该元素用于应用所导入的样式表中的模板规则。但是导入样式表中的模版规则的优先级要比主样式表中的模版规则要低。
实例代码例如:
<xsl:import href="common.xsl"/>//上文中的css模板文件名
<xsl:template match="css">
<head>
<xsl:apply-imports/>
</head>
</xsl:template>
代码导入了外部样式的样式文件,并应用于文件中。
attribute
元素
该元素用于向标签添加属性,其包括两个属性:
name
:必选属性,规定属性的名称;
namespace
:可选属性,规定属性的命名空间的URI。
attribute-set
元素
该元素可为标签定义多个属性值,其包括两个属性:
name
:必选属性,规定属性集的名称;
use-attribute-sets
:在属性集中引用其他属性集,由空格分隔。
实例代码如下所示:
<a>
<xsl:attribute-set name="att">
<xsl:attribute name="style">display:block</xsl:attribute>
<xsl:attribute name="href">www.123456.com</xsl:attribute>
<xsl:attribute name="id">myA</xsl:attribute>
</xsl:attribute-set>
</a>
代码为a标签添加了style、href以及id属性。
variable
元素
该元素用于声明变量,其包含两个属性:
name
:必选属性,规定变量的名称;
select
:可选参数,定义变量的值,若不选则为空字符串。
实例代码如下:
<xsl:variable name="classid" select="/DOCUMENT/item/classid" />
代码定义了变量classid
的值为xml文档中的classid
。
value-of
元素
该元素返回节点的值,输出到页面中,其包含两个属性,为:
select
:必选参数,规定获取值的路径;
disable-output-escaping
:可选,若值为“yes”,则输出时不会将结果进行转义,若值为“no”,则“<”输出结果为“<”。默认值为“no”。
实例代码如下:
<a>
<xsl:attribute-set name="att">
<xsl:attribute name="id"> <xsl:value-of select="$classid" /></xsl:attribute>
</xsl:attribute-set>
</a>
代码运用了之前的一些元素,a标签中的id则是采用了先前<xsl:variable>
元素声明的变量,直接采用$classid
即可获取其变量值。
choose
元素、when
元素以及otherwise
元素
<xsl:choose>
元素与<xsl:when>
元素以及<xsl:otherwise>
元素协同使用,类似于其他语言中的switch
结构。
当when
里的条件满足是,则执行when
结构里的代码;
若所以的when
都不满足条件,则执行otherwise
里的内容;
若没有otherwise
,则不执行内容。
实例代码如下:
<xsl:choose>
<xsl:when test="/DOCUMENT/item/key != ''">
<xsl:value-of select="/DOCUMENT/item/key " />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="/DOCUMENT/item/classid" />
</xsl:otherwise>
</xsl:choose>
上述代码判断xml中的key
是否为空,若不为空则返回,若为空则返回classid
里的内容。
if
元素
该元素用于在条件成立的情况下执行模板,其包含一个属性:
test
:必选属性,用于判断条件。
实例代码如下:
<xsl:if test="/DOCUMENT/item/key != ''">
<xsl:value-of select="/DOCUMENT/item/key " />
</xsl:if>
for-each
元素
该元素用于遍历指定节点中的每个元素,其包含一个属性:
select
:必选属性,用于指定要处理的节点集合。
实例代码如下:
<xsl:for-each select="/DOCUMENT/item/display/subitem">
<p><xsl:value-of select="key" />:<xsl:value-of select="value" /></p>
</xsl:for-each>
上述代码输出xml中的每个subitem
中的key
值和value
值。可以通过条件筛选进行选择要展示的遍历结果,其代码如下:
<xsl:for-each select="/DOCUMENT/item/display/subitem[value != “”]">
<p><xsl:value-of select="key" />:<xsl:value-of select="value" /></p>
</xsl:for-each>
上述代码遍历subitem
,选择其中value
不为空的节点进行输出。
学习还在继续,还请各路大神多多指正~