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

问题描述 投票:69回答:2

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

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

xslt
2个回答
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>

将此转换应用于以下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元素。对于这个purpuse,我们使用xslt指令处理它们:

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

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

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

模板规则:

<xsl:template match="num"/>

有必要覆盖xslt内置模板(默认处理),否则将导致输出其位置不能表示为num3*k +1节点的字符串值。

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

<xsl:template match="num"/>

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

因此我们得到了想要的结果。

使用一个好的XSLT调试器来了解如何应用这些模板将是有益的。


6
投票
<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

© www.soinside.com 2019 - 2024. All rights reserved.