xsl语法

XSL模板将XSL的设计细化成一个个模板(块),最后再将这些模板(块)组合成一个完整的XSL;好比船与集装箱,我们不是将所有的货物一件件地堆起来,而是装在各自的集装箱中,然后再在船上将这些集装箱堆放起来。这种方法可以使你先从整体上考虑整个XSL的设计,然后将一些表现形式细化成不同的模块,再具体设计这些模块,最后将它们整合在一起,这样,将宏观与微观结合起来,符合人们条理化、规范化要求。



  装集装箱--书写模板(块):<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>


<DIV align=center>
<SPAN class=pt9>
上例在浏览器中的样子(IE5.0或更新版本)</SPAN>

</DIV>

  保存文件,打开文件(个人简历.xml),效果令人满意吧。其实要做到同样的效果,用前面三周介绍的方法也可做,但你得把它作为一整体考虑。

  在上面的XSL文件中,我们将性别、生日、技能等数据项分别用模板来单独写,再用<xsl:apply-template>来调用,这样,即使你日后要对这些模板作相应的修改与扩充也很方便,不致于出现互相干扰、混杂不清的情况。这种从上至下、逐层细化的设计方法,极大地减少工作复杂程度,也大大减少了差错的产生,可以实现多人的协作设计。

  注意:如果XML文档中不同标记有同名的子标记,在为其编写模板时,应把父标记作为其前缀,格式为(parent_mark/child_mark)。模板文件必须有一个根模板,其属性match"/"





  XML技术的优势之一就在于数据输出的可选择性,即选择需要的数据输出。前面我们所讲到的选择模式语句:<xsl:for-each><xsl:value-of><xsl:apply-template>只是简单的选取通过"/"符号层层到达的节点,如果我们对XML数据不需要全部输出,而只需要其中的满足某条件的部分数据,"萝卜青菜、各取所需",那么条件判断<xsl:if>与多条件判断<xsl:choose><xsl:when>则迎合了这种需要,如果你对程序设计熟悉的话,会觉得它们似曾相识。



  XSL中的IF,首先,介绍XSL元素<xsl:if>的语法结构:



  语法:



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



  属性:

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

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

  test ──源数据测试条件。

  示例:

  此处以一份报表为例,文件名为report.xml,其内容如下:

<?xml version="1.0" encoding="GB2312"?>
<?xml:stylesheet type="text/xsl" href="report.xsl"?>
<document>

<report>
<class>
甲班
</class>
<q1>50</q1>
<q2>70</q2>
<q3>30</q3>
<q4>10</q4>
</report>

<report>
<class>
乙班
</class>
<q1>20</q1>
<q2>30</q2>
<q3>40</q3>
<q4>50</q4>
</report>

<report>
<class>
丙班
</class>
<q1>70</q1>
<q2>40</q2>
<q3>20</q3>
<q4>10</q4>
</report>

</document>



  我们采用XSL模板结合今天所学的<xsl:if>,为其编写一个XSL文档,要求季度产量小于等于20的用红色表示,文件名为report.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"/>
</TABLE>
</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>

<DIV align=center>
<SPAN class=pt9>
上例在浏览器中的样子(IE5.0或更新版本)</SPAN>

</DIV>





  说明:

  q1|q2|q3|q4 ── 标记q1q2q3q3均用此模板确定输出

  $le$ ── 是关系运算符中的"小于等于",其它关系有小于($lt$)、大于($gt$)、大于等于($ge$)、等于($eq$)、不等于($ne$)等。

  . ── 表示引用当前标记。

  [ ] ── 表示筛选,只有满足筛选条件的标记才能被选取。



  value() ──XSL函数,其他常用XSL函数有text()end()index()等。





  下期,我们将学习XSL的另外三个元素,可对同一数据进行多次测试,根据不同条件产生相应输出。









  上期我们学习了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标记SCRIPTLANGUAGE属性的取值相同,缺省为"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>


<DIV align=center>
<SPAN class=pt9>
上例在浏览器中的样子(IE5.0或更新版本)</SPAN>

</DIV>

  说明:在<xsl:choose>选择中,从第一个<xsl:when>开始,逐个测试,直到满足一个测试条件就将其中的内容输出,不再测试后面的条件;如果不满足任何一个条件,则输出<xsl:otherwise>中的内容。

  标记对<xsl:when></xsl:when><xsl:otherwise></xsl:otherwise>中可嵌套<xsl:if><xsl:choose>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值