首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法停止从过程的角度考虑XSLT ...apply-templates帮助

无法停止从过程的角度考虑XSLT ...apply-templates帮助
EN

Stack Overflow用户
提问于 2008-12-02 09:30:02
回答 3查看 946关注 0票数 4

我知道XSLT在过程化方面不起作用,但不幸的是,我已经研究过程化语言太久了。有没有人可以帮助我,简单地解释一下像应用模板这样的东西是如何工作的,并帮助像我这样的笨蛋理解它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-12-02 13:28:18

是什么让您认为程序性术语不适用于此?只是调用约定比您传统上期望的要隐含一些,因为其中涉及到一个不可见的上下文。apply-templates所做的一切都可以用过程术语来表示。

基本上,apply-templates只不过是一个for-each循环。从您当前在文档中的位置(上下文,想想"this")开始,它遍历子节点。

对于每个孩子,处理器选择具有最高优先级的匹配xsl:template (基于它们各自的matchpriority属性),设置手头的孩子的上下文,并运行此模板(考虑"function")。模板返回后,上下文迅速返回,轮到下一个子节点。

即使事情变得递归(这在XSLT中很难避免),整个过程实际上也不会变得更加复杂。上下文“指针”被移动,模板被调用。

您可以使用select属性限制apply-templates遍历的节点集:

代码语言:javascript
复制
<!-- all children of the context node regardless -->
<xsl:apply-templates />  

<!-- all children of the context node being "data" with a @name of "Foo" -->
<xsl:apply-templates select="data[@name='Foo']" />  

如果愿意,您可以在迭代之前对节点集进行排序:

代码语言:javascript
复制
<!-- all children of the context node being "data" with a @name of "Foo",
     ordered by their respective "detail" count -->
<xsl:apply-templates select="data[@name='Foo']"> 
  <xsl:sort select="count(detail)" data-type="number" order="descending"/>
</xsl:apply-templates>

如果需要,您可以将参数传递给模板,就像使用常规函数调用一样:

代码语言:javascript
复制
<!-- pass in some parameter -->
<xsl:apply-templates select="data[@name='Foo']"> 
  <xsl:with-param name="DateSetIcon" select="$img_src" />
</xsl:apply-templates>

这就是它的全部。

编辑:

我知道最后的评论有点挑衅。这是非常有意的,因为对apply-templates工作原理的基本了解或多或少就是这样。不是你在定义要调用的模板,而是让处理器为你选择正确的模板,这一事实带来的影响和可能性当然比未经训练的人听起来要大得多。整个事情的声明性/隐式方法肯定需要一些时间才能理解。

票数 5
EN

Stack Overflow用户

发布于 2008-12-02 09:42:10

我在很久以前就写过a blog entry,它展示了一个简单的样式表,它使用xsl:for-each以“过程化”的风格编写,而使用xsl:apply-templates编写的样式表与之相当。这不是一个全面的指南,但希望它会有一些用处。

票数 5
EN

Stack Overflow用户

发布于 2008-12-02 17:44:38

我非常同意Greg Beech的回答和博客文章。

有关<xsl:for-each><xsl:apply-templates>之间更详细的比较,请参阅中的问题"xsl: For -each vs. xsl:apply-templates“,并享受。

" xsl:apply -templates比xsl:-each更丰富、更深入,即使只是因为我们不知道在选择的节点上将应用什么代码--在一般情况下,这些代码对于节点列表的不同节点是不同的。此外,将应用的代码可以在编写xsl:apply templates之后由不知道原始作者的人编写“。

与过程性编程语言的另一个不同之处在于,应用模板的顺序不是预先定义的。在纯函数式编程语言中没有“状态”或“执行顺序”的概念。

和都没有指定应用所选模板规则的特定顺序--只是它们的结果将根据应用模板的节点的顺序(按排序的顺序,如果有任何<xsl:sort>指令,否则按节点的文档顺序)组合在一起。

说:

“评估的每个模板规则都会生成一个项目序列作为其结果。然后,将结果序列(排序序列中的每个节点对应一个)连接起来,形成一个序列。它们连接在一起,保留了排序序列中节点的顺序。最终连接的序列形成了xsl:apply- template指令的结果。”

规范中写道:

“实现可以自由地以任何方式处理源文档,从而产生与使用此处理模型处理的结果相同的结果。”

XSLT实现甚至可以并行应用模板(或<xsl:for-each>的主体)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/333463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档