XSLT表达式处理技术
操纵和处理特定的文档节点
使用<xsl:call-template>来处理一些节点而不是现在的文档节点,最迅速的技术是将元素<xsl:call-template>置于一个<xsl:for-each>元素内部,但是你也可以为一个目标模板提供一个唯一的节点名字,并且使用<xsl:apply-template>元素来应用于一些具体的节点。但是,"为每一个"建造, 是完全反复并且在特定的情形里更有意义的,在这些特定的情况下,在一份文档或者结果树里的全部节点无论如何都需要被处理。 你将发现这种方法的例子,有人在Michael Kay的XSLT 程序员参考里完全地详细说明。他也解释一种灵巧的技术,该技术描述了在一个<xsl:variable>元素里面调用<xsl:call-template>的方法。在<xsl:variable>元素里,一个简单的从结果树到字符行为的转换就好像<xsl:call-template>元素正从它的调用中返回的一个结果。
这类过程的结构可能被如下的方式说明, 在下面已给在方括号内的装入的字符值的模版在一个变量元素内被调用。
<!-- start with template definition, proceed to variable
element -->
<xsl:template name="bracketit">
<xsl:param name="string" />
<xsl:value-of select="concat("'[', $string, ']')"/>
</xsl:template>
<xsl:variable name="cite-in-brackets">
<xsl:call-template name="bracketit"/>
<xsl:with-param name="string" select="@cite"/>
</xsl:call-template>
</xsl:variable>
如果cite属性的值是Horn79,那么变量cite-in-brackets 的结果值为 [Horn79 ].
使用递推处理项目列表
XSLT没有像使用在传统的编程语言里的用来处理具体的计数行为的计数器一样的自动增加的变量,也不支持传统语言中的有条件的循环结构,例如while, for, 或者until 。 但是XSLT确实支持递推,提供一种方便的方法达到相同的目的。这个过程的这种方法导致了递归函数调用的建立, 这里功能接连不断被用于在一个列表中的第一个节点或者一个字符串里面的第一个非空节点, 并且功能也被适用于列表节点或者字符串的剩余部分——即在带有第一个要素或者字符顺序从它的内容除去后剩下的部分。 对每种类型的数据来说,处理会一直进行,直到列表或者字符串是空的的时候,即当不再有节点出现或者非空的字符存在在剩余的部分的时候。在他的书名为Mastering XSLT 的Sybex书中,Chuck White 指出XSLT 该方法是"重复每一个命名了的表达式的实例的结果片段。"
管理有条件处理
<xsl:choose>
<xsl:when test="expression">
<!-- processing statements -->
</xsl:when>
<xsl:otherwise>
<!-- processing statements -->
</xsl:otherwise>
</xsl:choose>