📄 0403-0400.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0071)http://162.105.170.55/ASPs/GetLearningArticleTemp.asp?section=0403-0400 -->
<HTML><HEAD><TITLE>XML中国论坛 - 初学进阶 - 4.3.4 XSLT句法与函数</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>TABLE {
FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"
}
.pt9 {
FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"
}
.pt10 {
FONT-WEIGHT: 700; FONT-SIZE: 10pt; LINE-HEIGHT: 18pt; FONT-FAMILY: "宋体"
}
.TempOutline {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; COLOR: #666666; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.TempOutline1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; COLOR: #666666; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.Outline {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.Outline1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.Outline11 {
FONT-SIZE: 9pt; MARGIN-LEFT: 38pt; TEXT-INDENT: -50pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage0 {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage11 {
FONT-SIZE: 9pt; MARGIN-LEFT: 38pt; TEXT-INDENT: -50pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage111 {
FONT-SIZE: 9pt; MARGIN-LEFT: 51pt; TEXT-INDENT: -64pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
</STYLE>
<META content="Microsoft FrontPage 5.0" name=GENERATOR></HEAD>
<BODY vLink=#000000 aLink=#000000 link=#000000 leftMargin=0 topMargin=0
onload=""><!-- 以下为主体内容 -->
<div align="center">
<center>
<TABLE width="100%" border=0 style="border-collapse: collapse" bordercolor="#111111" cellpadding="0" cellspacing="0">
<TBODY>
<TR vAlign=top>
<TD width=47 rowSpan=2></TD>
<TD vAlign=center width="535" >
<p align="center"><IMG height=33
src="image/title_learner.gif" width=226></TD>
<TD width=44 rowSpan=2></TD>
</TR>
<TR vAlign=top>
<TD width="535" ><!-- 正文内容 -->
<DIV class=pt10><B>4.3.4 XSLT句法与函数</B></DIV>
<DIV></DIV><BR>
<DIV class=pt9>
<P>从前面的例子中,相信读者已经大概了解了XSLT的一般形态及功能。在这一小节里,我们再来综合地论述一下。
<OL>
<LI><STRONG>文档结构</STRONG> </LI></OL>
<P>前面说过,XSLT文档本身是XML文档,因此文档的第一句自然是:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><?xml version="1.0"
?></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>接下来是样式单部分:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><BR>…
…<BR></xsl:stylesheet></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>也可以写作:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><BR>…
…<BR></xsl:transform></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>xsl:transform与xsl:stylesheet具有相同的含义,都表示元素所包含的内容为样式单。xsl:stylesheet元素必须包含有"version"属性,用以指示该XSL文档遵从哪一个版本的XSL标准。另外,xmlns:xsl指示了XSL的命名空间,在XSLT标准中,定义了XSLT的命名空间为http://www.w3.org/1999/XSL/Transform。</P>
<P>XSLT在进行转换时,首先遍历XML源文档树,找到要处理的节点,然后将定义好的模板信息施加到该节点中。
<OL>
<LI type=disc value=2><STRONG>模板及应用</STRONG> </LI></OL>
<P>xsl:template是模板元素,通常每个xsl:template有一个节点匹配属性,由"match="指定。在对模板进行匹配时使用"xsl:apply-templates",选择要匹配的模板,相当于一个调用的过程。对节点的匹配规则遵照XPath。</P>
<P>不同的模板设计,可以导致同一个文档有不同的输出效果。xsl:template元素有一个mode属性,可以根据需要去匹配不同模式的模板。若将前例作如下修改:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><xsl:template match="/" mode="blue">
<BR> …<BR><TITLE>学生花名册</TITLE>
<BR><STYLE> .title{font-size:15pt; font-weight:bold;
color:blue }<BR>…
<P><xsl:template match="/" mode="red"> <BR>
…<BR><TITLE>学生花名册</TITLE> <BR><STYLE>
.title{font-size:15pt; font-weight:bold; color:red
}<BR>…</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>如果要将TITLE输出为蓝色,则用下面语句匹配:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><xsl:apply-templates select="/"
mode="blue"/></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>如果要将title输出为红色,则写为:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><xsl:apply-templates select="/"
mode="red"/></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>此外,模板总是与节点相对应的,一个节点可能对应于不同的模板,那么如何确定各模板匹配的先后次序呢?XSLT中可为xsl:template设置优先级,写法是:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><xsl:template match="student" priority="n">
//n为优先级数</TD></TR></TBODY></TABLE></CENTER></DIV>
<OL start=3>
<LI><STRONG>计算节点值</STRONG> </LI></OL>
<P>在使用XSLT进行转换时,常常需要获取节点值,使用xsl:value-of元素可达到这个目的,如下例:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><xsl:value-of
select="origin"/></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>得到的是学生原籍的值,select属性指定要获取的是哪一个节点的节点值。
<OL start=4>
<LI><STRONG>循环处理</STRONG> </LI></OL>
<P>使用xsl:for-each可对所选节点依次进行处理,如例中在生成表格处理中,就是利用循环将各个学生的信息取出放入表格中的,写法是:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><xsl:for-each select="student"
order-by="name">
…</xsl:for-each></TD></TR></TBODY></TABLE></CENTER></DIV>
<OL start=5>
<LI><STRONG>排序</STRONG> </LI></OL>
<P>对于用xsl:for-each或xsl:apply-templates匹配的节点,可使用xsl:sort将所选节点内容进行排序,如:</P>
<DIV align=center>
<CENTER>
<TABLE width="90%" border=1>
<TBODY>
<TR>
<TD align=middle width="20%"><STRONG>排序方式</STRONG></TD>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -