为什么不一次执行所有XSLT模板?

时间:2009-10-25 17:39:23

标签: templates xslt

this posting中,我不明白为什么两个模板块不会同时在传入的XML中执行。到目前为止,我可以看到,无论是否使用apply-templates调用,XSL都会冒着为每个Document元素执行的第二个模板的风险。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

与根节点<xsl:template match="/">匹配的模板  是转换的起点,并控制从那一点开始发生的事情。

如果根节点的模板未调用 apply-templates ,那么您将只获得该根模块中该模板中描述的输出。

但是,因为它确实调用 apply-templates ,它会告诉处理器执行与其遇到的内容匹配的任何模板规则。 @select 中给出的xpath表达式恰好是Problems/Problem/Description,这限制了处理器将模板规则应用于描述元素的内容。< / p>

因此,由于XSLT具有为描述元素定义的模板(<xsl:template match="Description"> ),为它遇到的每个Description元素触发该模板。

答案 1 :(得分:1)

Mads是正确的,一个模板只匹配根xml元素,一个匹配特定元素(问题/问题/描述)。所以,这两个是在不同的元素上运作。但是,你的问题更普遍吗?这是为什么两个xsl:模板都不能匹配针对它执行的特定XML元素?换句话说,为什么匹配“node()”的模板和匹配“Problems / Problem / Description”的模板都不会针对相同的Problems / Problem / Description XML元素运行?

如果是这样,那么您将缺少一个关键的XSLT概念,优先级。它类似于你在代数中学习的操作顺序(除法,乘法,减法,加法)。在XSLT中它的工作原理如下。对于任何给定的XML元素,默认行为是只处理一次。 XSLT引擎的工作是确定所有可能针对特定XML元素的模板,并找到最具体的并仅应用该模板。

如何确定特异性有点复杂,但在这个例子中,它很简单。一个模板匹配任何节点(node()),另一个模板匹配特定的命名节点。因此,具体命名的节点获胜。

有关优先级的完整规则,请参阅W3C的XSLT规范的第5.5节。 http://www.w3.org/TR/xslt