xslt - 可以给我 xsl 中模板 "mode"的示例吗?

标签 xslt xslt-1.0 xslt-2.0

<xsl:template name="temp_name" mode="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(行)中,每行包含三列(最后一行可能异常(exception)):

<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 形式表示的 num 元素(其中 k 是整数),与空主体的模板匹配,因此不被处理。

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

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

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

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

模板规则:

<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 调试器来逐步了解这些模板的应用情况会很有启发性

关于xslt - 可以给我 xsl 中模板 "mode"的示例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4486869/

相关文章:

xml - xpath concat函数将XML数据转换为文本

xml - XSLT:我可以使用 xslt 更新 xml 节点中的值吗?

java - 使用 Saxon 和 XSLT 转换 JDOM XML 文档

xslt - 如何将一个 XSL 文件包含到另一个文件中?

xml - 错误 : 'Unsupported XSL element ' http://www. w3.org/1999/XSL/Transform:for-each-group''

xml - 使用 XSLT 转换从 XML 生成类似树形网格的 HTML

xml - 用于 XML 到 XSL-FO 的 XSL 样式表

xslt-1.0 - 具有多个条件的键 xslt

xslt - 您可以使用 XSLT 中的函数定义自定义排序规则吗?

xslt - 编写用于计算新值的递归函数 XSLT/XPath