首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不能停止在程序方面考虑XSLT ...帮助apply-templates

不能停止在程序方面考虑XSLT ...帮助apply-templates
EN

Stack Overflow用户
提问于 2018-12-08 05:52:48
回答 2查看 0关注 0票数 0

我知道XSLT在程序性方面不起作用,但遗憾的是我已经在程序语言中工作太久了。任何人都可以通过简单的术语解释应用模板的工作原理并帮助像我这样的厚实理解来帮助我。

EN

回答 2

Stack Overflow用户

发布于 2018-12-08 14:44:17

是什么让您认为程序性术语不适用于此?这只是调用约定比传统上预期的更隐式,因为涉及到一个看不见的上下文。一切都适用 - 模板确实可以用程序术语表达。

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

对于每个子节点,处理器选择具有最高优先级的匹配xsl:模板(基于它们各自的匹配和优先级属性),将上下文设置为手边的子节点并运行该模板(想想“功能”)。模板返回后,上下文会快速恢复,这是下一个孩子的回合。

即使事情变得递归(在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如何工作这或多或少。不是你要定义什么样的模板,而是让处理器为你选择合适的模板这一事实带来的影响和可能性当然比未经训练的耳朵听起来更大。整个事物的陈述/隐含方法肯定需要一些时间才能融入其中。

票数 0
EN

Stack Overflow用户

发布于 2018-12-08 15:12:02

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

有关详细比较<xsl:for-each><xsl:apply-templates>查看对xsl-list中问题“xsl:for-each与xsl:apply-templates”的回答,并享受整个线程

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

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

XSLT 2.0XSLT 1.0都没有指定应用所选模板规则的任何特定顺序 - 只是它们的结果将根据节点的顺序组合(在排序的序列中,如果有任何<xsl:sort>指令或以其他方式在文档顺序中应用模板的节点)。

XSLT 2.0规范说:

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

XSLT 1.0规范说:

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

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

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

https://stackoverflow.com/questions/-100000924

复制
相关文章

相似问题

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