XSLT变量定义和流程控制


XSLT应用——变量定义和流程控制

定义变量,使用<xsl:variable>元素,一经定义变量值不可改变
语法:<xsl:variable name="string" select="xpathExpression"></xsl:variable>
说明:属性name必选,用于指定变量名。select,XPath表达式可选,用于为变量赋值,当没有select属性时变量的值由<xsl:variable>的内容模板来决定。
select属性赋值:可以是,数值、布尔、字符串或节点集合。
属性值为数值:<xsl:variable name="center" select="round(count(menu) div 5)"/> 
节点集合赋值:<xsl:variable name="cooks" select="menu[@type='鲁菜']"/>
变量值一经设定,不可改变.

content赋值:用来赋值的内容模板必须输出文本或节点集合,作为一个临时结果树赋值给该变量,此时的变量可以看做临时结果树片段的根节点。
注意:使用select属性直接将某个节点集合赋值给某个变量,此时该变量并不是所有节点的根节点,内容模板赋值时,变量是临时结果树的根节点。
区别:其实是XPath表达式和临时结果树片段的区别。<xsl:variable name="pos" select="2"/>
 <xsl:copy-of select="menu[$pos]"/>
变量的有效范围:元素<xsl:variable>定义的变量的有效范围为父元素内部,在<xsl:stylesheet>的子元素层次定义的变量可以是全局变量:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:variable name="var" select="2"/>
  <xsl:template match="cookbook">
 <xsl:apply-templates select="menu[$var]"/>
  </xsl:template>
  <xsl:template match="menu">
   <xsl:apply-templates select="dish[$var]"/>
  </xsl:template>
  <xsl:template match="dish">
    <xsl:copy-of select="."/>
  </xsl:template>
</xsl:stylesheet>
将变量的定义置于一个模板内:

条件控制:<xsl:if>
语法:<xsl:if test="XPathExpression"></xsl:if>
说明:text属性必须指定一个XPath表达式,用于判断是否执行元素包起来的内容,为接下来要使用的XML test的值是字符串类型(长度大于0为真);数值类型(非0为真);布尔类型;节点集合类型(集合非空为真);

多条件选择:<xsl:choose>
语法:<xsl:choose>
 <xsl:when test="xpathExpression">
 </xsl:when>
 <xsl:when test="xpathExpression">
 </xsl:when>
 <xsl:otherwise>
 </xsl:otherwise>
说明:可以理解为if(){} else if(){} else{};
xsl:choose>
          <xsl:when test="price &lt; 10">Cheap</xsl:when>
          <xsl:when test="price &lt;= 20">Normal</xsl:when>
       <xsl:otherwise>Dear</xsl:otherwise>
        </xsl:choose>

循环处理:<xsl:for-each>
语法:<xsl:for-each select="node-set">
 </xsl:for-each>
说明:select必须,选择节点集合<xsl:for-each>将改变上下文节点,在内容模板中,上下文节点就是循环正在处理的节点。

循环嵌套:
<xsl:for-each>与<xsl:apply-templates>的关系用apply改写,可以看出,apply的应用看起来是调用一个外部函数,而for-each 更直观。

条件约束:
<xsl:template match="cookbook">
 <html>
   <head>
     <title>中国八大菜系</title>
   </head>
   <body>
     <table border="1">
     <xsl:for-each select="menu">
    <tr>
      <td>
     <xsl:value-of select="@type"/>
   </td>
      <xsl:for-each select="dish[contains(.,'鱼')]">
     <td>
       <xsl:value-of select="."/>
     </td>
   </xsl:for-each>
    </tr>
  </xsl:for-each>
  </table>
   </body>
 </html>
  </xsl:template>
多条件约束:
 <xsl:template match="people">
    <html>
   <body>
     <table border="1">
    <tr align="center">
      <td>name</td>
   <td>age</td>
   <td>salary</td>
   <td>dept</td>
    </tr>
       <xsl:for-each select="person[age=22][dept='testing']">
      <tr align="center">
           <xsl:apply-templates select="*"/>
            </tr>
       </xsl:for-each>
  </table>
   </body>
 </html>
  </xsl:template>
  <xsl:template match="*">
    <td>
   <xsl:value-of select="."/>
 </td>
  </xsl:template>
过滤条件的顺序并非是任意的。

异常处理:
可以用<xsl:fallback>指定备用程序;用<xsl:element-available>

posted @ 2009-09-13 20:44  flora_asp.net  阅读(1746)  评论(0编辑  收藏  举报