有人能给我举一个 xsl 中 template 的“ mode”的例子吗?

进去

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

mode是什么意思?我搜索了很多资源,但是找不到这方面的例子。有人能举个例子解释一下吗?

67024 次浏览

给模板同时赋予名称和模式 没有太大意义。

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>

在这个转换中,任何位置不能以形式 3*k +1(其中 k是一个整数)表示的 num元素都由一个主体为空的模板进行匹配,因此不会被处理。

但是,我们希望处理应该构成一行单元格的所有 num元素。为此,我们使用 xslt 指令处理它们:

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

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

因此,我们不会忽略选定的 num元素,而是以 copy模式 处理它们,并创建一行的 td s。

模板规则:

<xsl:template match="num"/>

重写 xslt 内置模板(默认处理)是必要的,否则将导致输出位置不能表示为 3*k +1num节点的字符串值。

因此,这些节点由两个模板 处理:

<xsl:template match="num"/>

还有

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

这样我们就得到了想要的结果。

使用一个好的 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>

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

mode属性允许以多种方式处理相同的 XML 元素。

如果要使用 mode属性,模板必须具有 match属性,因此它们不适用于仅依赖于 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 元素的模式匹配,请提供一个 null 模板,如:

<xsl:template match="*" mode="edit" />

确保不会从深度匹配中得到“幻影”文本,从而污染输出。

与任何 xsl catchall 模板一样,对于相同的模式,将其放在所有 xsl:template的开头,因为 xsl 只使用最后一个匹配模板,而将其放在最后将确保不会看到任何内容!