Ven*_*kat 69 xslt xslt-2.0 xslt-1.0
在
<xsl:template name="temp_name" mode="mode">
Run Code Online (Sandbox Code Playgroud)
是什么意思mode?我搜索了很多资源,但我找不到这方面的例子.那么有人可以用一个例子解释一下吗?提前致谢.
Dim*_*hev 84
为模板提供名称和模式并不太有意义.
该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>
Run Code Online (Sandbox Code Playgroud)
将此转换应用于以下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>
Run Code Online (Sandbox Code Playgroud)
结果是数字显示为三个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>
Run Code Online (Sandbox Code Playgroud)
在此转换中,num具有无法在表单中表示的位置3*k +1(其中k是整数)的任何元素都由具有空主体的模板匹配,因此不会被处理.
但是,我们希望处理num应该构成行的单元格的所有元素.对于这个purpuse,我们使用xslt指令处理它们:
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
Run Code Online (Sandbox Code Playgroud)
这意味着:"不要应用于通常应用的选定节点模板(在任何模式下),但应用copy模式中的模板"
因此,我们不会忽略所选num元素,而是在copy模式下处理它们并创建td一行的s.
模板规则:
<xsl:template match="num"/>
Run Code Online (Sandbox Code Playgroud)
必须覆盖xslt内置模板(默认处理),否则将导致输出num其位置无法表示的节点的字符串值3*k +1.
因此,这两个模块处理这些节点:
<xsl:template match="num"/>
Run Code Online (Sandbox Code Playgroud)
和
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
Run Code Online (Sandbox Code Playgroud)
因此我们得到了想要的结果.
使用一个好的XSLT调试器来了解如何应用这些模板将是有益的.
<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>
Run Code Online (Sandbox Code Playgroud)
在此处链接一个简单的示例:https : //msdn.microsoft.com/en-us/library/ms256045%28v=vs.110%29.aspx
该mode属性允许以多种方式处理相同的 XML 元素。
match如果要使用属性,模板必须具有属性mode,因此它们不适用于仅依赖name属性进行调用的模板。
它们应用来xsl:apply-templates确定哪个xsl:template将响应,因此使用模式的应用只会调用使用相同模式的模板。没有模式的模板将仅响应没有模式的应用。
例如,您可能希望将 XMLparagraph元素呈现为 HTMLp元素以供查看,但作为form用于编辑的元素。
然后可以通过以下方式呈现以供查看:
<xsl:template match="paragraph">
<p>...</p>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
当通过以下方式调用时,它将匹配paragraphXML 文档中的标签:
<xsl:apply-templates />
Run Code Online (Sandbox Code Playgroud)
相反,要渲染以进行编辑,请使用:
<xsl:template match="paragraph" mode="edit">
<form>...</form>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
通过致电:
<xsl:apply-templates mode="edit" />
Run Code Online (Sandbox Code Playgroud)
请注意,在示例中,如果要使用 non-mode 呈现页面的其余部分xsl:apply-templates,xsl:template mode="edit"则必须显式调用该版本才能paragraph编辑特定元素。
如果不需要所有 XML 元素都具有模式匹配,请提供空模板,例如:
<xsl:template match="*" mode="edit" />
Run Code Online (Sandbox Code Playgroud)
确保您不会从深度匹配中获得“幻影”文本,从而污染输出。
与任何 xsl 包罗万象的模板一样,将其放在xsl:template同一模式的所有 s 的开头,因为 xsl 只使用最后一个匹配的模板,并将其放在最后将确保看不到任何内容!