在
<xsl:template name="temp_name" mode="mode">
mode
的含义是什么?我搜索了很多资源,但我找不到这方面的例子。那么有人可以用一个例子来解释吗?
答案 0 :(得分:83)
为模板提供名称和模式并没有太大意义。
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
为整数)的形式表示,并且由具有空体的模板匹配,因此没有处理。
但是,我们希望处理应该构成一行单元格的所有num
元素。对于这个purpuse,我们使用xslt指令处理它们:
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
表示:“不应用于通常应用的选定节点模板(在无模式下),但应用copy
模式下的模板”
因此,我们不会忽略所选的num
元素,而是以copy
模式处理它们,并创建一行的td
。
模板规则:
<xsl:template match="num"/>
必须覆盖xslt内置模板(默认处理),否则会导致输出其位置不能表示为num
的{{1}}个节点的字符串值。
因此,这些节点由两个模板处理:
3*k +1
和
<xsl:template match="num"/>
因此我们得到了想要的结果。
通过一个好的XSLT调试器来了解如何应用这些模板将是有益的。
答案 1 :(得分:6)
<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
答案 2 :(得分:1)
mode
属性允许使用多种方法来处理相同的XML元素。
如果要使用match
属性,则模板必须具有mode
属性,因此它们并不是仅依赖于name
属性进行调用的模板。
它们适用于xsl:apply-templates
,以确定哪些xsl:template
会响应,因此使用模式的调用将仅调用使用相同模式的模板。没有模式的模板将仅响应没有模式的呼叫。
例如,您可能希望将XML paragraph
元素呈现为HTML p
元素以供查看,而呈现为form
进行编辑。
然后可以通过以下方式呈现供查看:
<xsl:template match="paragraph">
<p>...</p>
</xsl:template>
,当通过以下方式调用时,它将与XML文档中的paragraph
标签匹配:
<xsl:apply-templates />
相反,要渲染以供编辑使用:
<xsl:template match="paragraph" mode="edit">
<form>...</form>
</xsl:template>
通过以下方式致电:
<xsl:apply-templates mode="edit" />
请注意,在该示例中,如果要使用非模式xsl:apply-templates
呈现页面的其余部分,则必须为特定的xsl:template mode="edit"
显式调用paragraph
版本}元素进行编辑。
如果不需要所有XML元素都具有模式匹配,请提供一个空模板,例如:
<xsl:template match="*" mode="edit" />
确保不会从深度匹配中获得“幻像”文本,从而污染了输出。
与任何xsl catchall模板一样,将其放在相同模式的所有xsl:template
的开头,因为xsl使用最后一个匹配的模板,并且将其放在最后将确保什么都看不到!