在
<xsl:template name="temp_name" mode="mode">
模式
的含义是什么?我搜索了很多资源,但找不到相关示例。那么有人可以举个例子来解释一下吗?
最佳答案
给模板同时指定名称和模式并没有多大意义。
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
(行)中,每行包含三列(最后一行可能异常(exception)):
<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>
在此转换中,任何位置无法以 3*k +1
形式表示的 num
元素(其中 k
是整数),与空主体的模板匹配,因此不被处理。
但是,我们想要处理应构成行单元格的所有 num
元素。为此,我们使用 xslt 指令处理它们:
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
这意味着:“不应用于通常应用(在无模式下)的选定节点模板,但应用处于复制
模式的模板”
因此,我们不会忽略选定的 num
元素,而是以复制
模式处理它们并创建 td
一行。
模板规则:
<xsl:template match="num"/>
需要覆盖 xslt 内置模板(默认处理),否则会导致 num
个节点的字符串值的位置无法表示为 3*k +1
,待输出。
因此,这些节点由两个模板处理:
<xsl:template match="num"/>
和
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
这样我们就得到了想要的结果。
使用良好的 XSLT 调试器来逐步了解这些模板的应用情况会很有启发性。
关于xslt - 可以给我 xsl 中模板 "mode"的示例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4486869/