zoukankan      html  css  js  c++  java
  • XSLT的元素语法

    XSLT的元素语法
    xsl:template和xsl:apply-templates
    xsl:value-of
    xsl:for-each
    xsl:if
    Xxsl:choose, when, otherwise
    xsl:sort

    xsl:template和xsl:apply-templates
    模板(template)是XSLT中最重要的概念之一。XSLT文件就是由一个一个的模板组成,任何一个XSLT文件至少包含一个模板。模板的概念就象是搭积木;你如果是程序员,也可以将模板看作一个方法,一个类,或者一个模块。它们可以被拼装组合,也可以单独成块,不同的模板控制不同的输出格式。
    模板(template)由两部分组成:匹配模式(match pattern)和执行。简单的讲模式定义XML源文档中哪一个节点将被模板处理,执行则定义输出的是什么格式。两部分对应的语法为xsl:template和xsl:apply-templates。
    xsl:template的语法是:
    <xsl:template
    match = pattern
    name = qname
    priority = number
    mode = qname>
    <!-- 执行内容 -->
    </xsl:template>
    xsl:template的作用是定义一个新模板。属性中name,priority,和mode用来区别匹配同一节点的不同模板。它们不是常用的属性。match属性则控制模板的匹配模式(pattern),匹配模式是用来定位XML源文档中哪一个节点被模板处理。一个模板匹配一个节点。我们用一个例子来帮助理解:
    假设我们要处理一个包含章节和段落文档。我们用para元素定义段落,用chapter元素定义章节。我们来看看match属性可能的值。下面的语句写法说明模板匹配所有的para元素
    <xsl:template match="para">
    </xsl:template>
    下面的语句写法说明模板匹配所有的para元素和所有的chapter元素:
    <xsl:template match="(chapter|para)">
    </xsl:template>
    下面的语句写法说明模板匹配所有的父节点为chapter元素的para元素:
    <xsl:template match="chapter//para">
    </xsl:template>
    下面的语句写法说明模板匹配根节点:
    <xsl:template match="/">
    </xsl:template>
    我们再来看apply-templates语法:
    <xsl:apply-templates
    select = node set-expression
    mode = qname>
    </xsl:apply-templates>
    xsl:apply-templates用来执行那一个节点被模板具体处理。你可以将它理解为程序中调用子函数。select属性用来定义确切的节点名称。xsl:apply-templates总是包含在xsl:template元素中,象这样:
    <xsl:template match="/">
    <xsl:apply-templates select="para"/>
    </xsl:template>
    这段代码说明摸板匹配整个文档(根节点),具体执行时处理根节点下所有para元素。
    <xsl:template match="para">
    <p><xsl:apply-templates/></p>
    </xsl:template>
    而这一段代码则表示摸板匹配para节点,所有para下的子元素都将被处理。


    xsl:value-of
    XSL:value-of用来将源文档中元素的文本值写到输出文档中。例如:
    有一个个人资料的XML文档:
    <?xml version="1.0" encoding="iso-8859-1"?>
    <PERSON>
    <name>ajie</name>
    <age>28</age>
    </PERSON>
    我如果想在输出文档中显示上面这个XML源文档中的name元素的值,可以这样写XSLT代码:
    <xsl:template match="PERSON">
    <xsl:value-of select="name"/>
    </xsl:template>
    执行后,你会看到"ajie"被单独显示出来。其中match="PERSON"定义摸板匹配PERSON节点,xsl:value-of
    语法说明需要输出一个节点的值,而select="name"则定义需要被输出的元素为name。看这个过程是不是和数据库里查询一个人的名字很象?当然,xsl:value-of查询还有更多,更复杂的语法,因为是涉及寻找和定位的功能,我们会放在后面的XPath语法中在仔细讲解。
    同样功能的还有xsl:copy-of,用法一样,就不重复解释了。


    xsl:for-each
    xsl:for-each语法允许你循环处理被选择的节点。例如:有一个含多个个人资料的XML文档:
    <?xml version="1.0" encoding="iso-8859-1"?>
    <PEOPLE>
    <PERSON>
    <name>ajie</name>
    <age>28</age>
    </PERSON>
    <PERSON>
    <name>tom</name>
    <age>24</age>
    </PERSON>
    <PERSON>
    <name>miake</name>
    <age>30</age>
    </PERSON>
    </PEOPLE>
    我需要显示所有人的姓名,则可以将XSLT代码写成:
    <xsl:template match="PEOPLE">
    <xsl:for-each select="child::PERSON">
    <xsl:value-of select="name"/>
    </ xsl:for-each>
    </xsl:template>


    xsl:if
    xsl:if类似普通程序语言的if条件语句,允许设定节点满足某个条件时,被模板处理。xsl:if的语法格式为:
    <xsl:if test=布尔表达式>
    template body
    </xsl:if>
    例如:
    <xsl:template match="PEOPLE">
    <xsl:if test="@name">
    <p><xsl:value-of select="@name"/></p>
    </xsl:if>
    </xsl:template>
    这段代码的意思是检测PEOPLE节点下所有的元素,如果发现有<name>元素,则将<name>元素的值输出。其中@符号是统配符,表示节点下所有的元素。


    xsl:choose, xsl:when 和 xsl:otherwise
    xsl:if语法没有else的属性。如果我们要进行多项选择,那么就要使用xsl:choose / xsl:when / xsl:otherwise系列流程控制语法了。具体的使用请看下面的XSL文件例子:
    <xsl:template match="PEOPLE">
    <xsl:choose>
    <xsl:when test="@name = 'ajie'">
    <B><xsl:value-of select="@name"/></B>
    </xsl:when>
    <xsl:when test="@name">
    <I><xsl:value-of select="@name"/></I>
    </xsl:when>
    <xsl:otherwise>
    No name available
    </xsl:otherwise>
    <xsl:choose>
    </xsl:template>
    说明:首先在PEOPLE节点下寻找<name>属性值为ajie的元素,如果找到,将ajie用粗体输出;如果没有发现值为ajie的<name>元素,则将所有的<name>元素的值都用斜体输出;如果没有发现任何<name>元素,则显示"No
    name available"。


    xsl:sort
    在XSLT中可以对XML源文档的元素进行重新排序,排序的语法就是xsl:sort。举例:下面的代码就是将文档元素按name排序。
    <xsl:template match="PEOPLE">
    <xsl:apply-templates select="PERSON">
    <xsl:sort select="@name"/>
    </xsl:apply-templates>
    </xsl:template>
    以上是XSLT的元素的主要语法,还有很多其他的语法,例如:import, include, element, attribute, number, param等等语法.

  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/xh831213/p/466099.html
Copyright © 2011-2022 走看看