关于xsl

作用:将xsl转化成html
注意事项:
必须有一个模板
标签:
<template match="/">
<apply-templates select="路径"/>
--循环
<foreach>
--排序
<sort select="元素名" order="ascending/descending"/>
--判断
--if
<if test="元素=''">
</if>
<if test="元素 lt; ''">
</if>

<if test="@属性名=''">
</if>
--choose
<choose>
<when test=''></when>
<otherwise></otherwise>
</choose>

<choose>
<when test="students/student[(score <85 or score =85) and sex='女']"></when>
<otherwise></otherwise>
</choose>
--变量
<varial name="a1">
<value-of>count(students/student)</value-of>
</varial>

<varial name="a2">
<value-of>sum(students/student/score)</value-of>
</varial>

<varial name="a3">
<value-of>round(($a1 div $a2)*10) div 10</value-of>
</varial>
--取值
<value-of/>
--应用模块可以代循环
--数据的转化
--两个源(xml、xsl),一个目标(html)

1、<xsl:for-each>

  如在XML中有这样的数据:

<author>
<name>小禹</name>
<name>春华</name>
<name>秋实</name>
</author>

  我们要读取这三个作者名字,是个一个地按"author/name"方法来读取吗,可有多个这样的name呀?如果有一种程式性的语句来循环读取有多好啊!

  想得非常对,XSL提供了这样的具有程式语言性质的语句:<xsl:for-each>

  用他读取这三个作者名字的方法如下:

<xsl:for-each select="author/name">
……
</xsl:for-each>

  select,顾名思义,选取,他能选定XML中特定唯一的标记,也能选择某一类相同的标记,我们称之为结点集。

  语法:

<xsl:for-each select="pattern" order-by="sort-criteria-list">

  属性:

  1.select

  根据XSL样式查询考察上下文以决定哪类结点集(满足select条件)使用此样式描述。作为一种简化的表示就是,如果你想对文件中的某一种标记的内容的显示方式进行格式化,就能将让select等于此元素的标记名。例如欲对标记xml_mark进行格式化,即可用如下方式表示:

<xsl:for-each select="xml_mark">
<!--样式定义-->
</xsl:for-each>

  2.order-by

  以分号(;)分隔、作为排序标准的列表。在列表元素前添加加号(+)表示按此标记的内容以升序排序,添加减号(-)表示逆序排序。作为一种简化的表示就是,排序标准列表就是由select规定的标记的子标记的序列,每个标记之间以(;)分隔。
  2、<xsl:value-of>

  <xsl:for-each>模式只是选取节点,并没有取出节点的值,好比猴子只是爬到了树的某个枝干上,那么就用< xsl:value-of >来摘"胜利果实"吧!

  语法:

<xsl:value-of select="pattern">提取节点的值

  属性:

  select用来和当前上下文匹配的XSL式样。简单的讲,如果要在XSL文件某处插入某个XML标记(假定是xml_mark标记)的内容,可用如下方式表示:

<xsl:value-of select="xml_mark"></xsl:value-of>

  或

<xsl:value-of select="xml_mark"/>

示例:

  此处仍以上期的个人简历的作为例子,我们需要对文件(个人简历.xml)作一定修改,确切的说是将其中的第二行:

<?xml:stylesheet type="text/css" href="resume.css"?>

  修改为:

<?xml:stylesheet type="text/xsl" href="resume.xsl"?>

  然后建立一个新文件:resume.xsl,其内容如下:

<?xml version="1.0" encoding="GB2312"?>
<HTML xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<HEAD>
<TITLE>个人简历</TITLE>
</HEAD><BODY>
<xsl:for-each select="resume">
<P/>
<TABLE border="1" cellspacing="0">
<CAPTION style="font-size: 150%; font-weight: bold">
个人简历
</CAPTION>
<TR>
<TH>姓名</TH><TD><xsl:value-of select="name"/></TD>
<TH>性别</TH><TD><xsl:value-of select="sex"/></TD>
<TH>生日</TH><TD><xsl:value-of select="birthday"/></TD>
</TR>
<TR>
<TH>技能</TH><TD colspan="5"><xsl:value-of select="skill"/></TD>
</TR>
</TABLE>
</xsl:for-each>
</BODY>
</HTML>

装集装箱--书写模板(块):<xsl:template>
  语法:

<xsl:template match="node-context" language="language-name">
  属性:
  match ── 确定什么样的情况下执行此模板。作为一种简化的说明,在此处使用标记的名字;其中最上层模板必须将match设为"/"。
  language ── 确定在此模板中执行什么脚本语言,其取值和HTML中的SCRIPT标记的LANGUAGE属性的取值相同,缺省值是Jscript。
  <xsl:template>用match属性从XML选取满足条件的节点,征对这些特定的节点形成一个特定输出形式的模板。
  吊集装箱上船--调用模板(块):<xsl:apply-templates>
  语法:
<xsl:apply-templates select="pattern" order-by="sort-criteria-list">
属性:
  select ── 确定在此上下文环境中应执行什么模板,即选取用< xsl:template >标记建立的模板(块)。
  order-by ── 以分号(;)分隔的排序标准,通常是子标记的序列。
  示例:
  以个人简历为例,为便于处理我们希望"技能"中每一项都用标记对<skill></skill>括起来,有多少项技能就有多少个这种标记对,经过修改后的个人简历XML文件内容如下:
<?xml version="1.0" encoding="GB2312"?>
<?xml:stylesheet type="text/xsl" href="resume_template.xsl"?>
<document>
<resume>
<name>禹希初</name>
<sex>男</sex>
<birthday>1977.5</birthday>
<skill>数据库设计和维护</skill>
<skill>WEB研发</skill>
</resume>
</document>

  然后,建立一个新XSL文件resume_template.xsl,采用模板的形式,其内容如下:

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<!--根模板-->
<xsl:template match="/">
<HTML><HEAD><TITLE>个人简历</TITLE></HEAD>
<BODY>
<xsl:apply-templates select="document/resume"/>
</BODY>
</HTML>
</xsl:template>
<!--简历模板-->
<xsl:template match="resume">
<TABLE border="1" cellspacing="0">
<CAPTION>个人简历(
<xsl:eval>formatIndex(childNumber(this),"I")</xsl:eval>
)</CAPTION>
<xsl:apply-templates select="name"/>
<xsl:apply-templates select="sex"/>
<xsl:apply-templates select="birthday"/>
<TR/>
<TD>技能</TD><TD COLSPAN="5">
<TABLE cellspacing="0">
<xsl:apply-templates select="skill"/>
</TABLE>
</TD>
</TABLE>
<BR/>
</xsl:template>
<!--姓名模板-->
<xsl:template match="name"><TD>姓名</TD>
<TD><xsl:value-of/></TD>
</xsl:template>
<!--性别模板-->
<xsl:template match="sex"><TD>性别</TD>
<TD><xsl:value-of/></TD>
</xsl:template>
<!--生日模板-->
<xsl:template match="birthday"><TD>生日</TD>
<TD><xsl:value-of/></TD>
</xsl:template>
<!--技能模板-->
<xsl:template match="skill">
<TR><TD><xsl:value-of/></TD></TR>
</xsl:template>
</xsl:stylesheet>


q1|q2|q3|q4 ── 标记q1、q2、q3、q3均用此模板确定输出
  $le$ ── 是关系运算符中的"小于等于",其他关系有小于($lt$)、大于($gt$)、大于等于($ge$)、等于($eq$)、不等于($ne$)等。
  . ── 表示引用当前标记。
  [ ] ── 表示筛选,只有满足筛选条件的标记才能被选取。
  value() ──XSL函数,其他常用XSL函数有text()、end()、index()等。
  下期,我们将学习XSL的另外三个元素,可对同一数据进行多次测试,根据不同条件产生相应输出。[page]
上期我们学习了XSL元素<xsl:if>,已能通过测试XML数据的值来决定不同的输出形式,不知你尝试过没有,实际上<xsl:for-each>也可部分实现<xsl:if>的功能,但有时,我们希望对同一数据同时测试多个条件,根据不同条件输出相应结果。当然,我们能用if,如果我们只有if可用的话。幸好我们有一个更好的选择,那就是用<xsl:choose>。下面介绍相关元素的语法:

  <xsl:choose>

  语法:<xsl:choose>

  属性:无,表示一个多选测试的开始
  <xsl:when>

  语法:

<xsl:when expr="script-expression" language="language-name" test="pattern">

  属性:

  expr ── 脚本语言表达式,计算结果为"真"或"假";如果结果为"真",且通过test,则在输出中显示其中内容(可省略此项属性)。

  language ── expr属性中表达式的脚本语言类型,其取值和HTML标记SCRIPT的LANGUAGE属性的取值相同,缺省为"JScript"。

  test ── 源数据测试条件。
  <xsl:otherwise>

  语法:<xsl:otherwise>

  属性:无,在一个多选测试中,如果没有不满足<xsl:when>规定的条件,如果在最后有此标记,则输出此标记中的内容。
  示例:
  此处以学生成绩单为例,需求按成绩的高低给出优秀( >85)、一般(70~85)、及格(60~69)、不及格(< 60),而不是显示分数。其中成绩单的XML文件(文件名:grade.xml)如下:

<?xml version="1.0" encoding="GB2312"?>
<?xml:stylesheet type="text/xsl" href="grade.xsl"?>
<document>
<grade>
<name>大胖</name>
<english>80</english>
<math>90</math>
<chymest>90</chymest>
</grade>
<grade>
<name>小花</name>
<english>98</english>
<math>70</math>
<chymest>85</chymest>
</grade>
</document>
  为实现按分数分等级显示,其XSL文件(文件名:grade.xsl)内容如下:
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<HTML>
<HEAD><TITLE>成绩单</TITLE></HEAD>
<BODY>
<xsl:apply-templates select="document"/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="document">
<TABLE border="1" cellspacing="0">
<TH>姓名</TH><TH>英语</TH><TH>数学</TH><TH>化学</TH>
<xsl:apply-templates select="grade"/>
</TABLE>
</xsl:template>
<xsl:template match="grade">
<TR>
<TD><xsl:apply-templates select="name"/></TD>
<TD><xsl:apply-templates select="english"/></TD>
<TD><xsl:apply-templates select="math"/></TD>
<TD><xsl:apply-templates select="chymest"/></TD>
</TR>
</xsl:template>
<xsl:template match="name">
<xsl:value-of/>
</xsl:template>
<xsl:template match="english|math|chymest">
<xsl:choose>
<xsl:when test=".[value()$gt$85]">优秀</xsl:when>
<xsl:when test=".[value()$gt$70]">一般</xsl:when>
<xsl:when test=".[value()$gt$60]">起格</xsl:when>
<xsl:otherwise>不起格</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值