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 < 10">Cheap</xsl:when>
<xsl:when test="price <= 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>