一个人可以给我在xsl模板的“模式”的例子吗?

<xsl:template name="temp_name" mode="mode"> 

mode的含义是什么? 我search了很多资源,但是我找不到这个例子。 那么有人可以用一个例子来解释吗? 提前致谢。

赋予模板名称和模式并不太有意义

name属性完全标识一个模板,不能有两个相同名称和不同模式的模板。

mode属性允许使用不同的模式多次处理相同的节点

这里是一个简短的例子:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="num[position() mod 3 = 1]"> <tr> <xsl:apply-templates mode="copy" select= ". | following-sibling::*[not(position() >2)]"/> </tr> </xsl:template> <xsl:template match="*" mode="copy"> <td><xsl:value-of select="."/></td> </xsl:template> <xsl:template match="num"/> </xsl:stylesheet> 

将此转换应用于以下XML文档时

 <nums> <num>01</num> <num>02</num> <num>03</num> <num>04</num> <num>05</num> <num>06</num> <num>07</num> <num>08</num> <num>09</num> <num>10</num> </nums> 

结果是数字显示在三个tr (行)中,每个包含三列 (可能除了最后一行):

 <tr> <td>01</td> <td>02</td> <td>03</td> </tr> <tr> <td>04</td> <td>05</td> <td>06</td> </tr> <tr> <td>07</td> <td>08</td> <td>09</td> </tr> <tr> <td>10</td> </tr> 

在这个转换中,任何一个num元素的位置不能用3*k +1 (其中k是一个整数)的forms表示,被一个空体模板匹配,因此不被处理。

但是,我们要处理应该形成一行的单元格的所有num元素。 对于这个purpuse,我们正在使用xslt指令处理它们:

 <xsl:apply-templates mode="copy" select= ". | following-sibling::*[not(position() >2)]"/> 

这意味着:“不要应用于通常应用的选定节点模板(无模式),而是应用处于copy模式的模板”

因此,我们不会忽略所选的num元素,而是在copy模式下处理它们,并创build一行的td

模板规则:

 <xsl:template match="num"/> 

是必要的,以覆盖xslt内build模板(默认处理),否则会导致其位置不能被表示为3*k +1num节点的string值被输出。

所以,这些节点都由两个模板处理

 <xsl:template match="num"/> 

 <xsl:apply-templates mode="copy" select= ". | following-sibling::*[not(position() >2)]"/> 

从而得到想要的结果。

通过一个好的XSLTdebugging器来了解这些模板是如何应用的,这将是有益的

在面向对象(OO)的术语中,xsl:apply-templates就像一个遍历对象(节点)列表的函数,并且对于每个对象都调用同一个多态函数。 样式表中的每个模板规则定义了单个多态函数的不同实现。 select哪个实现取决于对象(节点)的运行时特性。 进一步对OO进行类比, 模式名称标识了在调用xsl:apply-templates中重复执行哪个多态函数。

 <xsl:apply-templates select="phone" /> <xsl:apply-templates select="phone" mode="accountNumber"/> <xsl:template match="phone"> <TD>A</TD> </xsl:template> <xsl:template match="phone" mode="accountNumber"> <TD>B</TD> </xsl:template> 

链接一个简单的例子: https : //msdn.microsoft.com/en-us/library/ms256045%28v=vs.110%29.aspx