通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 my小屋
联系我们
设为首页
加入收藏

 

qq,asp,php,jsp,xml,sql,.net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | q q 专栏 | 建站经验 | 在线工具 | 站长club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>网页设计>>html/css>>正文 新版上线![旧版]
注:打开慢时请稍等

跟我学xsl(二)

http://www.iyit.net  日期:2006-5-27 9:22:56  来源:转载   点击:
参加讨论】跟我学xsl(二):表一、运算符与特殊字符
 运算符描述
/
选择子元素,返回左侧元素的直接子元素;如果"/"位于最左侧表示选择根结点的直接子元素
//
递归下降,不论深度,搜索指定的元素;如果位于最左侧表示从根结点出发递归下降搜索指定元素
.
表示当前元素
*
通配符,选择任意元素,不考虑名字
@

取得属性值,作为属性名的前缀

@*

通配符,选择任意属性,不考虑名字

:
名字作用范围分隔符,将名字作用范围前缀与元素或属性名分隔开来
!*
在相关节点上应用指定方法
()*
分组,明确指定优先顺序
[]
应用过滤样式
[]*
下标运算符,用于在集合中指示元素

  表二、逻辑运算符

 可选方式描述
and $and$ 或 &&
逻辑与
or $or$ 或 ||
逻辑或
not() $not$
逻辑非

  表三、关系运算符

 可选方式描述
= 或 $eq$
相等
= 或 $ieq$
相等(不区分大小写)
!= 或 $ne$
不等
$ine$
不等(不区分大小写)
< 或 $lt$
小于
$ilt$
小于(不区分大小写)
<= 或 $le$
小于等于
$ile$
小于等于(不区分大小写)
> 或 $gt$
大于
$igt$
大于(不区分大小写)
>= 或 $ge$
大于等于
$ige$
大于等于(不区分大小写)
$all$
集合运算符,如果集合中所有项目均满足条件则返回"真"
$any$
集合运算符,如果集合中任意项目满足条件则返回"真"
|
集合运算符,返回两个集合的联合

  示例一:

  从个人简历中寻找具有具有"web开发"技能的人的姓名与e-mail。假设文档结构如下所示:

<document>
<resume>
<name>name</name>
<sex>sex</sex>
<birthday>birthday</birthday>
<skill>skill1</skill>
<skill>skill2</skill2>

<skill>skilln</skill>
</resume>
<resume>

</resume>

</document>

  为从以上结构的个人简历中寻找出所有具有web开发"技能的人的姓名与e-mail的xsl文档结构如下:

<table border="1" cellspacing="0">
<th>姓名</th><th>e-mail</th>
<xsl:for-each select="resume [$any$skill="web开发"]">
<tr><td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="e-mail"/></td>
</tr>
</xsl:for-each>
</table>

  说明:

  1.[ ] ── 表示选择条件,只有满足条件的个人简历才被显示。

  2.$any$ ── 由于每个人有多种技能,故加$any$作为前缀,以使每个人所有技能都能被比较。

  3.skill='web开发' ── 筛选条件。

  示例二、

  仍上面的xml文档为例,如果欲选择1977/1/1之前出生的人的姓名、技能与e-mail,相应的xsl文档结构如下(假定生日格式为yyyy/mm/dd):

<table border="1" cellspacing="0">
<th>姓名</th><th>技能</th><th>e-mail</th>
<xsl:for-each select="resume[birthday$lt$"1977/1/1"]">
<tr>
<td><xsl:value-of select="name"/></td>
<td>
<xsl:value-of select="skill[0]"/>
<xsl:for-each select="skill[index()>0]">、
<xsl:value-of select="."/>
</xsl:for-each>
</td>
<td><xsl:value-of select="e-mail"/></td>
</tr>
</xsl:for-each>
</table>

  说明:

  1.birthday $lt$ '1977/1/1' ── 搜索条件,在此处使用"< "会错误,故使用"$lt$"表示小于。

  2.skill [0] ── 表示选择skill的第一项。

  3.skill [index()>0] ── 表示选择skill的第二项以后(包括第二项)的项目。

  4.xsl:value-of select="." ── 表示选择当前标记的值。

  相信大家应该注意到,在前面以及本次的例子中出现了一些函数,如index()、formatindex()、childnumber(),也许大家还不完全明了其中的含义吧?敬请关注下一课。[page]

本期学习xsl样式方法,即可用于xsl元素<xsl:for-each>、<xsl:value-of>、<xsl:template>的select属性、<xsl:apply-templates>的match属性、<xsl:if>、<xsl:when>的test属性中,对元素的范围进行筛选,从而提供更大的灵活性。


  xml与dhtml(动态html)一样,这些节点都是一个个对象,而且这些对象都是有层次的,从根节点开始构成一颗层次清淅的树状结构,这就形成了文档对象模型dom(document object model),通过对象的属性、方法来达到访问控制xml节点的目的。


  我们这里不打算就xml的dom逐一详细阐述,因为这完全可以写成一个篇幅较多的教程,我们先就一些常见的方法作一些讨论,以期对dom的对象方法有一个大致的了解。

  注:从本期开始,所有示例不再提供完整源代码,如有不明白之处,请仔细阅读前面七期、并动手练手。

  一、end()

  含义:返回集合中最后一个元素。

  示例:输出最后一份简历

  假定xml文件格式为:

……<resume>…</resume>……<resume>…</resume>……

  相应xsl文件内容为:

<xsl:for-each select="resume[end()]">……</xsl:for-each>

  或:

<xsl:templates match="resume[end()]">……</xsl:templates>

  或:

<xsl:apply-template select="resume[end()]">……</xsl:apply-template>

  二、index()

  含义:返回该元素在集合中的位置,返回值是一整数,其中第一个元素返回0。

  示例:返回前面三份简历。

resume[index()$le$3]

  注意:index()是与父元素相关的,请看下例:

<x>
<y/>
<y/>
</x>
<x>
<y/>
<y/>
</x>

  返回所有<x>中的第一个<y>

x/y[index()=0] 或x/y[0]

  三、nodename()

  含义:返回元素的名字,即标记名。

  示例:选择任意元素,假如其名字(即标记名)等于"name":

*[nodename()='name'] 或 *[name]

  四、number()

  含义:将值转换为数值形式,如果不是数值则返回空,要求参数。

  示例:年龄(age)小于30岁的人的简历(resume):

resume[number(age)$lt$30] 或 resume[age$lt$30]

  五、nodetype()

  含义:返回结点类型,结果为是数值。以下是返回值列表:

 结点类型 结点类型值 结点的字符形式描述
 element 1 'element'
 element attribute 2 'attribute'
 markup-delimited region of text 3 'text'
 processing instruction 7 'processing_instruction'
 comment 8 'comment'
 document entity 9 'document'

  六、value()

  含义:返回元素或属性的值。

  示例:value()是元素或属性的缺省方法,以下表示是等价:

name!value()="name" 与 name="name"

@attr="attribute_value" 与 @attr="attribute_value"

  注:@是属性前缀,@attr表示是属性attr

  七、attribute()

  含义:返回所有属性结点的集合,等价于"@*"。

  示例:寻找所有的resume元素,满足条件至少有一个属性的值为"abc":

resume[$any$attribute()='abc'] 或 resume[$any$@*='abc']

  寻找所有的resume元素,满足条件至少有一个子元素有一个属性的值为"abc":

resume[$any$*/attribute()='abc'] 或 resume[$any$*/@*='abc']

  八、comment()

  含义:返回所有注释结点。

  示例:

resume[$any$comment()='禹希初的简历']

  表示寻找含有注释语句:<!--禹希初的简历-->的<resume>元素。

  九、cdata()

  含义:返回所有cdata类型的结点的集合。

  示例:

resume[$any$cdata()='禹希初的简历']

  表示寻找含有下述语句(必须是直接子结点)<![cdata[禹希初的简历]]>的<resume>元素。

  十、node()

  含义:返回当前上下文环境中除根结点和属性结点以外的所有结点的集合,等价于:

"*|pi()|comment()|text()"

  示例:寻找所有元素resume,其最后一个结点的名字为"skill":

resume[node()[end()]!nodename()='skill']

  寻找所有resume元素的第一个结点:resume/node()[0]。

  十一、textnode()

  含义:返回所有文本类型的结点的集合。

  示例:寻找每一个p元素的第二个文本结点:

p/textnode(1) 或 p!textnode(1)

  十二、text()

  含义:返回所有表示文本字符串的结点的集合,等价于"cdata()|textnode()"。

  本期的内容就介绍至此,另有一个函数date()在本人的机器上一试就发生错误使浏览器自动关闭,还有一个函数pi()本人尚未找到适当的应用方法,就不介绍了,下期将讲述如何xsl中使用脚本。[page]

有时,我们可能会希望xml文档输出时能对其中内容加上一些统计信息或者如编号什么的,利用前面的知识就不太容易实现了。今天将介绍两个新元素<xsl:eval>与<xsl:script>,使我们能轻松处理这个难题。

<xsl:eval>

  含义:计算脚本表达式,输出一个文本字符串。

  语法:

<xsl:eval language="language-name">

  属性:

  language ── 规定所用脚本语言的名字,可用的属性有"javascript"、"jscript"、"vbscript"、"vbs"等,缺省为"jscript"。

<xsl:script>

  含义:声明全局变量或定义函数。

  语法:

<xsl:script language="language-name">

  属性:同<xsl:eval>


  示例:

  不知大家对于第四期《跟我学xml》中的例子是否还有印象?其中的xml文档并没有对简历编号,但输出中却加上了大写的罗马数字序号。今天将再举一稍为复杂一些的例子:

  假如我们编写一份年终生产统计表,其中需要小计一项,常规的作法是事先将其算出来,现在不必了,我们可以只给出单项统计,显示时再统计小计一项。请找出《跟我学xml》的第四期,xml文件不必修改,对xsl文件的修改如下:

<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/tr/wd-xsl">

<xsl:template match="/">
<html><head><title>1999年生产统计</title></head>
<body><xsl:apply-templates select="document"/></body>
</html>
</xsl:template>

<xsl:template match="document">
<h3>1999年生产统计</h3>
<table border="1" cellspacing="0">
<th>班组</th>
<th>一季度</th>
<th>二季度</th>
<th>三季度</th>
<th>四季度</th>
<xsl:apply-templates select="report"/>

<tr><td>小计</td>
<td><xsl:eval>total(this,"q1")</xsl:eval></td>
<td><xsl:eval>total(this,"q2")</xsl:eval></td>
<td><xsl:eval>total(this,"q3")</xsl:eval></td>
<td><xsl:eval>total(this,"q4")</xsl:eval></td>
</tr>


</table>

<xsl:script>
function total(node,q)
{
  temp=0;
  mark='/document/report/'+q;
  v=node.selectnodes(mark);
  for(t=v.nextnode();t;t=v.nextnode())
  {
    temp+=number(t.text);
  }
  return temp; //小计值
}
</xsl:script>

</xsl:template>

<xsl:template match="report">
<tr>
<td><xsl:value-of select="class"/></td>
<td><xsl:apply-templates select="q1"/></td>
<td><xsl:apply-templates select="q2"/></td>
<td><xsl:apply-templates select="q3"/></td>
<td><xsl:apply-templates select="q4"/></td>
</tr>
</xsl:template>

<xsl:template match="q1|q2|q3|q4">
<!--此处测试产量,如小于等于20则添加一style属性color,其值为red(红色)-->
<xsl:if test=".[value() $le$ 20]">
<xsl:attribute name="style">color:red</xsl:attribute>
</xsl:if>
<xsl:value-of/>
</xsl:template>

</xsl:stylesheet>


上例在浏览器中的样子(ie5.0或更新版本)

  说明:

  注意到执行结果的变化了吗?黑体部分为添加部分,注意添加部分分为两部分,<xsl:script></xsl:script>必须置于</table>之后,切记。

  selectnodes() ── 是xmldomobject的一个方法,返回文档中所有满足条件的结点的集合,条件与< xsl:for-each >和select属性的取值采用同样的写法,可以加筛选、下标等限制,如寻找一季度产量大于等于50的班组:

/document/report/q1[value() $ge$ 50]

  以上写法还有一个更简单的写法:

//q1[value()$ge$50]

  //表示从根结点出发遍历所有结点,寻找满足条件的结点,如果文档内有同名但意义不同的结点则不能用此种方法,非不得已不建议使用。以此为例,如果希望统计年总产量,则可以下述字符串寻找结点(建议使用最后一种,此种描述将精确找到需要汇总的数据):

//*[value()$gt$0] 或 //(q1|q2|q3|q4) 或 /document/report/(q1|q2|q3|q4)

  nextnode() ── 返回结点集中的下一个结点

  number() ── 将提供的参数转换为数值


  下期介绍xsl函数2,用于<xsl:script>及<xsl:eval>中,以及<xsl:if>和<xsl:when>的expr属性。建议读者熟悉javascript、jscript、vbscript中至少一种,否你能用xsl完成的工作将十分有限。由于篇幅关系,此处不作详细介绍。[page]

本期介绍多个xsl对于vbscript、jscript增加的方法、属性,以充分发挥xml的优势,用于<xsl:script>、<xsl:eval>标记内表达式的编写或<xsl:if>、<xsl:when>的expr属性。

  一、absolutechildnumber

  含义:返回结点相对于它所有的兄弟(不论名字是否相同)的序号。

  语法:absolutechildnumber(node)

  参数:node ── 对象,欲返回编号的结点。

  示例:

  1、假定文档结构为:<document><head/><body/></document>,其中document为顶层结点,下述表达式将输出:

<xsl:eval>
absolutechildnumber(this.selectnodes('/document/body').item(0))
</xsl:eval>

  2、确定当前结点相对于其所有兄弟的序号:

<xsl:eval>
absolutechildnumber(this)
</xsl:eval>

  二、ancestorchildnumber

  含义:从给定结点出发根据给定祖先结点名返回最近的祖先结点的序号(相对于同名结点)。如果找不祖先,则返回0。

  语法:ancestorchildnumber(bstrnodename, pnode)

  参数:

  bstrnodename ── 字符串。被搜索的祖先结点的名字。

  pnode ── 对象。搜索开始位置的结点。

  示例查找当前结点最近的名为report祖先结点:

ancestorchildnumber('report',this)

  三、attributes

  含义:返回结点属性的集合。

  语法:object.attributes

  参数:object ── 结点对象。

  示例:当前结点属性的个数

this.attributes.length

  当前结点第三个属性的值

this.attributs.item(2).value



this.attributes.item(2).text



this.attributes(2).text

  注意:如果给定的下标大于属性总和减1将出错,第一个属性的下标是0。

  四、basename

  含义:返回有名字空间限制的基本名,即不包括名字前缀。

  语法:object.basename

  参数:object ── 结点对象

  示例,当前结点的基本名:

this.basename

  五、childnumber

  含义:返回结点相对于同名同胞的序号。

  语法:childnumber(object)

  参数:object ── 结点对象

  示例,假定xml文档结构如下:

<x><y><z></z></y></x>

  如果当前结点是z,则childnumber(this)返回1,而absolutechildnumber(this)返回3。

  六、datatype

  含义:设定或读取结点的数据类型。

  语法:设定结点的数据类型 object.datatype=objvalue
     读取结点的数据类型 objvalue=object.datatype

  参数:object ── 结点对象。

  示例,读取当前结点的数据类型:

dttype=this.datatype

  七、depth

  含义:指定结点出现在文档树上的深度,即该结点位于文档第几层,顶层结点位于第一层,根结点(即用"/"表示的结点)位于第0层。

  语法:depth(pnode)

  参数:pnode ── 结点对象

  示例,当前结点的深度:

depth(this)

  八、firstchild、lastchild

  含义:返回结点的第一个子结点(或最后一个子结点)。

  语法:pnode.firstchild
     pnode.lastchild

  参数:pnode ── 结点对象

  示例,当前结点的第一个结点的名字:

this.firstchild.nodename

  九、formatindex

  含义:用指定的计数系统格式化提供的整数。

  语法:formatindex(lindex, bstrformat)

  参数:

  lindex ── 整型数值或变量

  bstrformat ── 数据格式,可选值有a、a、i、i、1、01(以0打头的数值形式,如果要求固定长度的编号如0001、0002则非常有用)。

  示例,当前结点的大写罗马数字编号:

formatindex(childnumber(this),'i')

  十、formatnumber

  含义:以指定格式输出数值。

  语法:formatnumber(dblnumber, bstrformat)

  参数:说明同formatnumber,不同之处在于格式化的可以是小数。

  示例,对变量a的值格式化为两位小数:

formatnumber(a,'#.00'):

  十一、haschildnodes

  含义:如果结点有子结点则返回true(-1),否则为false(0)。

  语法:pnode.haschildnodes()

  注意:与此前介绍的函数不同,此函数后必须带一个空括号。

  示例,判断当前结点是否有子结点:

this.haschildnodes

  十二、namespaceuri、prefix

  含义:返回结点名字空间的全局资源标识符(或前缀)。

  语法:pnode.namespaceuri
     pnode.prifix

  十三、nextsibling、previoussibling、parentnode

  含义:返回结点的下一个兄弟(或前一个兄弟、或结点的父结点)。

  语法:pnode.nextsibling
     pnode.previoussibling
     pnode.parentnode

  注意:对根结点(即"/")应用parentnode方法、对第一个孩子结点应用previoussibling方法、对最后一个孩子结点应用nextsibling方法均会导致错误,可通过此过关系运算符==(等于)和!=(不等于)来判断一个结点是否某一指定结点,格式为pnode1 = pnode2或pnode2 != pnode2。

  十四、nodename

  含义:返回元素、属性、入口的名字或其他类型结点的一个特定字符串。

  语法:pnode.nodename

  示例,当前结点的名字:

this.nodename

  十五、nodetype、nodetypestring

  含义:返回结点的类型的数值形式(或字符串形式)。

  语法:pnode.nodetype 或 pnode.nodetypestring

  返回值:

 结点类型 结点类型值 结点的字符形式描述
 element 1 'element'
 element attribute 2 'attribute'
 markup-delimited region of text 3 'text'
 processing instruction 7 'processing_instruction'
 comment 8 'comment'
 document entity 9 'document'

  十六、nodetypedvalue

  含义:以结点预定义的数据类型返回结点的值。

  语法:pnode.nodetypedvalue

  示例,假定当前结点的数据类型是fixed.14.4,下例将以数值返回结点的值,而不是文本一个字符串:

this.nodetypedvalue

  十七、nodevalue

  含义:返回结点的文本。

  语法:pnode.nodevalue

  注意:该方法不用于元素类结点,可用于属性、cdata、注释、文本等结点。

  示例,当前元素第一个属性的值:

this.attributes(0).nodevalue

  当前元素内的文本(假定该元素内只有文本,无其它元素,即<mark>text</mark>,建议多尝几次掌握其确切的用法)。

this.firstchild.nodevalue

  十八、ownerdocument

  含义:返回包含该结点的文档的根。

  语法:pnode.ownerdocument

  注意:该方法用于文档的根结点将出错。

  十九、selectnodes

  含义:给定的样式匹配应用于当前结点并返回匹配的结点集合。

  语法:pnode.selectnodes('pattern')

  提示:pattern的编写与<xsl:for-each>的select属性的值类似,其中以"/"开头表示从文档的根出发搜索;以"//"开头表遍历文档的所有结点;以".."开头表示从当前结点的父结点开始;如果欲从当前结点向下搜索则不能有以上特殊字符打头。

  示例,与当前结点同名的元素在其父元素内的个数:

childnumber(this.selectnodes("../"+this.nodename+"[end()]").item(0))

  当前元素内名字为"skill"的元素的个数:

childnumber(this.selectnodes("skill[end()]").item(0))

  二十、selectsinglenode

  含义:与selectnodes类似,不同的只返回匹配的第一个结点、而不是结点集合。

  语法:pnode.selectsinglenode('pattern')

  示例,与当前结点同名的元素在其父元素内的个数:

childnumber(this.selectsinglenode("../"+this.nodename+"[end()]"))

  当前元素内名字为"skill"的元素的个数:

childnumber(this.selectsinglenode("skill[end()]"))

  二十一、text

  含义:返回结点与它的子树内的文字内容。

  语法:pnode.text

  示例,整个文档内的文字内容:

this.ownerdocument.text

  当前元素及其子树的文字内容:

this.text

  二十二、xml

  含义:返回结点及其后代的xml表示。

  语法:pnode.xml

  示例,当前文档的xml内容:

this.ownerdocument.xml

  另有几个函数不作介绍,列于其下以供参考,如感兴趣,请访问http://msdn.microsoft.com获取详细说明。

formattime(vartime, bstrformat,vardestlocale)
formatdate(vardate, bstrformat,vardestlocale)
apendchild(newchild)
definition
clonenode
insertbefore(newchild, refchild)
parsed
removechild(oldchild)
replacechild(newchild, oldchild)
specified
transformnode(stylesheet)
transformnodetoobject(stylesheet,outputobject)
uniqueid(pnode)



编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:利用css改善网站可访问性
下一篇:跟我学xsl(一)
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
最新更新 热点排行 推荐新闻
在 css 中关于字体处理效果的思考
html 初学者指南
showmodelessdialog()使用详解
仿 office 2003 的工具条
跟我学xsl(一)
在 css 中关于字体处理效果的思考
html 初学者指南
showmodelessdialog()使用详解
仿 office 2003 的工具条
跟我学xsl(一)
跟我学xsl(二)
利用css改善网站可访问性
用js封装的时间设置器
ubb 转换函数演示
用 onerror 获取错误信
一个优秀的超链接鼠标悬停提示css+js
使用dom创建xml
*.htc 文件的简单介绍
html 初学者指南
读取符合rss2.0规范的xml文档
优秀公益广告作品欣赏(8)
java数据类型转换
windows xp专业版iis连接数的更改
新开放qq免费挂级网站
优秀公益广告作品欣赏(7)
免费在qq上看在线电影电视听音乐
office2007简体中文版浮出水面 美图抢
qq珊瑚虫外挂4.0版本发布!
web服务器配置全攻略(三)
免费把qq炫铃设为本机qq的系统提示音
msn8.0下载
如何在win20003中更好的玩游戏
qq收费头像免费使用的方法 
微软将在华推分期付款,充值卡pc 可低价
 amd处理器am2测试 风扇竟运行7分钟
exeplorer.exe错误的问题的总结、解决
asp.net 2.0 中的异步页功能应用
硬盘坏道修复及数据恢复宝典
免费登录搜索引擎入口大全
搜索引擎注册九大秘法
 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
copyrights © 2004-2006 iyit.net all rights reserved.
网站合作、广告联系qq:147007642、466949678
易特网络技术 点击这里给我发消息