可以给我一个xsl中模板"模式"的例子吗?

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


And*_*rew 7

<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


Pat*_*ali 7

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-templatesxsl:template mode="edit"则必须显式调用该版本才能paragraph编辑特定元素。

如果不需要所有 XML 元素都具有模式匹配,请提供空模板,例如:

<xsl:template match="*" mode="edit" />
Run Code Online (Sandbox Code Playgroud)

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

与任何 xsl 包罗万象的模板一样,将其放在xsl:template同一模式的所有 s 的开头,因为 xsl 只使用最后一个匹配的模板,并将其放在最后将确保看不到任何内容!