call-template vs. apply-template

原创 2005年03月01日 20:28:00

                                                   call-template  vs  apply-template对比


Element: xsl:call-template
Calling a template by name. Causes no context switch (change of context
node) as apply-templates and for-each do. The template you call by name will
 still be processing the same context node as your current template. This el
ement can be used to reuse the same functionality in several templates.

Element: xsl:apply-templates
Used to pass the context on to another template. The select attribute
specifies which nodes should be transformed now, the processor decides
which templates will be used.

                                                  一. 调用函数call-template

The <xsl:call-template> enables you to invoke a named template—that is, an <xsl:template> element—that has an assigned name attribute. If an <xsl:template> element has a name attribute, it might, but need not, also have a match attribute. An <xsl:call-template> element invokes a template by name; it has a required name attribute that identifies the template to be invoked. Unlike <xsl:apply-templates>, <xsl:call-template> does not change the current node or the current node-list.

An error occurs if a style sheet contains more than one template with the same name and with the same import precedence.

An <xsl:call-template> element can contain any number of <xsl:with-param> elements. However, it cannot contain other XSLT elements.

for example:
调用函数一样call-template,通过with-param传入参数.
<xsl:call-template name="topic_title">
         <xsl:with-param name="editable" select="$editable"/>
         <xsl:with-param name="value" select="@title"/>
</xsl:call-template>
其中$editable为全局变量 , @title为节点属性

注意:
1.
已知
<xsl:template name="numbered-block">
   <xsl:param name="format">1. </xsl:param>
   <fo:block>
      <xsl:number format="{$format}"/>
      <xsl:apply-templates/>
   </fo:block>
</xsl:template>
 a.则<xsl:call-template name="numbered-block"/>  使用默认参数调用函数,即1,2,3..

 则<xsl:call-template name="numbered-block">
   <xsl:with-param name="format">a. </xsl:with-param>
  </xsl:call-template> 使用给定参数调用函数,即a,b,c...

 apply-template即为把节点中的值写入html.


 b.可以这样给函数指定参数:(value-of select)从节点获得
 <xsl:with-param name="value">
   <xsl:value-of select="."/>
 </xsl:with-param>


 c.也可以这样给函数指定参数:(直接写好true)
 <xsl:with-param name="editable">true</xsl:with-param>

 d.<xsl:param name="value"/>无默认值的函数参数
 即
 <xsl:template name="para_title">
    <xsl:param name="value"/>
    <xsl:param name="editable"/>
  ...操作
 </xsl:template>

2.template(模板)匹配的方法:
<xsl:template match="ol//ol/li">
   <br/>&#xA0;&#xA0;&#xA0;
   <xsl:call-template name="numbered-block">
      <xsl:with-param name="format">a. </xsl:with-param>
   </xsl:call-template>
</xsl:template>
每次遇到ol//ol/li节点则调用其间操作.
同理,
<xsl:template match="ol/li">
   <br/>
   <xsl:call-template name="numbered-block"/>
</xsl:template>
每次遇到ol/li节点则调用其间操作.


3.
$读取参数或变量值
@读取节点


设置参数变量 <xsl:param name="editable" select="true"/>值为true

                                                        二. 函数apply-template
<xsl:apply-templates
  select = Expression
  mode = QName>
</xsl:apply-templates>

Directs the XSLT processor to find the appropriate template to apply, based on the type and context of each selected node

The <xsl:apply-templates> element first selects a set of nodes using the expression specified in the select attribute. If this attribute is left unspecified, all children of the current node are selected. For each of the selected nodes, <xsl:apply-templates> directs the XSLT processor to find an appropriate <xsl:template> to apply. Templates are tested for applicability by comparing the node to the XPath expression specified in the template's match attribute. If more than one template satisfies the match pattern, the one appearing with the highest priority is chosen. If several templates have the same priority, the last in the style sheet is chosen.

例子:
XML File (customers.xml)

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="applyt.xsl" ?>
<customers>
   <customer>
      <name>John Smith</name>
      <address>123 Oak St.</address>
      <state>WA</state>
      <phone>(206) 123-4567</phone>
   </customer>
   <customer>
      <name>Zack Zwyker</name>
      <address>368 Elm St.</address>
      <state>WA</state>
      <phone>(206) 423-4537</phone>
   </customer>
   <customer>
      <name>Albert Aikens</name>
      <address>368 Elm St.</address>
      <state>WA</state>
      <phone>(206) 423-4537</phone>
   </customer>
   <customer>
      <name>Albert Gandy</name>
      <address>6984 4th St.</address>
      <state>WA</state>
      <phone>(206) 433-4547</phone>
   </customer>
   <customer>
      <name>Peter Furst</name>
      <address>456 Pine Av.</address>
      <state>CA</state>
      <phone>(209) 765-4321</phone>
   </customer>
   <customer>
      <name>Dan Russell</name>
      <address>9876 Main St.</address>
      <state>PA</state>
      <phone>(323) 321-7654</phone>
   </customer>
</customers>

XSLT File (applyt.xsl)

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="/">
   <HTML>
      <BODY>
         <TABLE border="1" cellspacing="0" cellpadding="2">
            <xsl:apply-templates select="customers/customer">
               <xsl:sort select="state"/>
               <xsl:sort select="name"/>
            </xsl:apply-templates>
         </TABLE>
      </BODY>
   </HTML>
</xsl:template>

<xsl:template match="customer">
   <TR>
      <xsl:apply-templates select="name" />
      <xsl:apply-templates select="address" />
      <xsl:apply-templates select="state" />
      <xsl:apply-templates select="phone" />
      <xsl:apply-templates select="phone" mode="accountNumber"/>
   </TR>
</xsl:template>

<xsl:template match="name">
   <TD STYLE="font-size:14pt font-family:serif">
      <xsl:apply-templates />
   </TD>
</xsl:template>

<xsl:template match="address">
   <TD> <xsl:apply-templates /> </TD>
</xsl:template>

<xsl:template match="state">
   <TD> <xsl:apply-templates /> </TD>
</xsl:template>

<xsl:template match="phone">
   <TD> <xsl:apply-templates /> </TD>
</xsl:template>

<xsl:template match="phone" mode="accountNumber">
   <TD STYLE="font-style:italic">
      1-<xsl:value-of select="."/>-001
   </TD>
</xsl:template>

</xsl:stylesheet>

Output:
This is the processor output:

<HTML>
<BODY>
<TABLE border="1" cellspacing="0" cellpadding="2">
<TR>
<TD STYLE="font-size:14pt font-family:serif">Peter Furst</TD>
<TD>456 Pine Av.</TD>
<TD>CA</TD>
<TD>(209) 765-4321</TD>
<TD STYLE="font-style:italic">
      1-(209) 765-4321-001
   </TD>
</TR>
<TR>
<TD STYLE="font-size:14pt font-family:serif">Dan Russell</TD>
<TD>9876 Main St.</TD>
...
</TR>
</TABLE>
</BODY>
</HTML>


xslt中的apply-template和call-template的区别

xslt中的apply-template和call-template的区别 在使用xslt进行xml内容转化时会经常用到两种方式调用template,即apply-template和call-t...
  • woailaopoqq
  • woailaopoqq
  • 2015年01月08日 16:46
  • 573

xsl模板 apply-template和call-template

简单说apply是应用,call是调用。      用apply时,引擎自动搜索与当前select指定xpath的匹配节点相匹配的template(该template必须有属性match)并使用该t...
  • baixiaoyu9997
  • baixiaoyu9997
  • 2013年12月05日 10:51
  • 349

XSL基础: call-template,apply-templates,xsl:param,with-param,number format 用法

XSL基础: call-template,apply-templates,xsl:param,with-param,number format 用法
  • ws_hgo
  • ws_hgo
  • 2011年04月10日 12:23
  • 3015

xsl:template 和 xsl:apply-templates 的用法

有两种基本方法提取源元素中的内容。 stylesheet 使用 xsl:value-of 来获得,此时 已经处理得元素的内容不会再被进一步处理。 stylesheet 中的 xsl:apply-tem...
  • xiaoqiangpku725
  • xiaoqiangpku725
  • 2009年03月31日 12:25
  • 4129

xsl 遍历模板

有如下的XML结构:                                                   101                           no       ...
  • mlzhu007
  • mlzhu007
  • 2011年02月11日 18:01
  • 560

浅谈对<xsl:apply-templates/>的理解

http://www.cnblogs.com/it_mac/archive/2010/06/27/1766151.html 前几天做XML的练习,目的是把给出的XML文档按要求的格式显示出来,用...
  • u010523770
  • u010523770
  • 2017年04月06日 22:00
  • 280

【最优化方法】穷举法 vs. 爬山法 vs. 模拟退火算法 vs. 遗传算法 vs. 蚁群算法

优化算法入门系列文章目录(更新中):   1. 模拟退火算法   2. 遗传算法   一. 爬山算法 ( Hill Climbing )          介绍模拟退火前...
  • kuvinxu
  • kuvinxu
  • 2014年06月29日 08:46
  • 2252

堆溢出问题

以前没怎么弄过堆溢出问题,直到最近看见Google研究团队发布了关于dnsmasq的一系列问题 (需要翻墙)其中有两个CVE涉及到了Heap Overflow。其中的基础知识不再赘述,可以直接参考以下...
  • iextract
  • iextract
  • 2017年10月12日 18:12
  • 314

Benchmark: PHP vs. Python vs. Perl vs. Ruby

Benchmark: PHP vs. Python vs. Perl vs. Ruby 转自:http://xodian.net/serendipity/index.php?/archive...
  • ghlfllz
  • ghlfllz
  • 2011年10月15日 16:34
  • 4729

CSS Font-Size: em、 px 、pt 、Percent

CSS Font-Size: em、 px 、pt 、Percent 一、基础介绍 1、“Ems”: em,大小不固定 ,成为相对单位(body则相对浏览器的默认字体设置,子集相对父级), 浏览器...
  • mmrsdym
  • mmrsdym
  • 2014年05月15日 11:32
  • 969
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:call-template vs. apply-template
举报原因:
原因补充:

(最多只允许输入30个字)