75

In

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

What is the meaning of mode? I searched many many resource, but i couldn't find example for that. So can anybody explain with an example?

4

3 回答 3

93

给模板一个 name 和一个 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(行)中,每列包含三列(最后一行可能除外):

<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应该形成行的单元格的所有元素。对于这个目的,我们使用 xslt 指令处理它们:

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

这意味着:“不要应用于通常会应用的选定节点模板(在无模式下),但应用处于copy模式下的模板”

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

模板规则:

<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 调试器逐步了解这些模板是如何应用的,这将是有益的

于 2010-12-20T06:24:29.037 回答
8
<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

于 2016-05-18T05:25:39.913 回答
4

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

match如果要使用属性,模板必须具有mode属性,因此它们不适用于仅依赖于name属性进行调用的模板。

它们 apply toxsl:apply-templates以确定哪些xsl:templates 将响应,因此使用模式的应用只会调用使用相同模式的模板。没有模式的模板只会响应没有模式的应用。

例如,您可能希望将 XMLparagraph元素呈现为 HTMLp元素以供查看,但作为form用于编辑的元素。

然后可以通过以下方式呈现以供查看:

<xsl:template match="paragraph">
 <p>...</p>
</xsl:template>

当通过以下方式调用时,它将匹配paragraphXML 文档中的标签:

<xsl:apply-templates />

相反,要渲染以供编辑使用:

<xsl:template match="paragraph" mode="edit">
 <form>...</form>
</xsl:template>

通过调用:

<xsl:apply-templates mode="edit" />

请注意,在示例中,如果要使用 non-mode 呈现页面的其余部分,则xsl:apply-templates必须xsl:template mode="edit"显式调用版本paragraph才能编辑特定元素。

如果您不需要对所有 XML 元素进行模式匹配,请提供一个空模板,例如:

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

以确保您不会从污染输出的深度匹配中获得“幻影”文本。

与任何 xsl 包罗万象的模板一样,将其放在所有xsl:templates 的开头以用于相同的模式,因为 xsl 仅使用最后一个匹配的模板,并将其放在最后将确保什么都看不到!

于 2020-08-18T06:20:25.973 回答