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

时间:2010-12-20 04:26:36

标签: xslt

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

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

3 个答案:

答案 0 :(得分:83)

为模板提供名称和模式并没有太大意义。

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内置模板(默认处理),否则会导致输出其位置不能表示为num的{​​{1}}个节点的字符串值。

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

3*k +1

<xsl:template match="num"/>

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

mode属性允许使用多种方法来处理相同的XML元素。

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

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

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

与任何xsl catchall模板一样,将其放在相同模式的所有xsl:template的开头,因为xsl使用最后一个匹配的模板,并且将其放在最后将确保什么都看不到!