一个人可以给我在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 +1
的num
节点的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