2010-07-20 85 views
1

鉴于以下XML和XSL转换,我期望输出中包含文本firstsecond的两个<node/>元素。此预期基于以下推理:XSL模板处理所有后代,而不仅仅是儿童

  1. 将首先执行带有match="/root"的模板。该模板中的<xsl:apply-templates/>指令将应用最具体的模板for all child nodes
  2. 这些<foo/>子节点将由第二个模板处理。该模板还包含<xsl:apply-templates/>指令,该指令将模板应用于这些节点的子节点。
  3. <foo/>节点只包含<bar/>节点,它们不匹配任何模板。这意味着没有更多的节点会被处理。

XML

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="style.xsl"?> 
<root> 
    <foo name="first"> 
    <bar> 
     <foo name="nested"/> 
    </bar> 
    </foo> 
    <foo name="second"> 
    <bar> 
     <baz> 
     <foo name="nested"/> 
     </baz> 
    </bar> 
    </foo> 
</root> 

XSL

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/root"> 
    <output> 
     <xsl:apply-templates/> 
    </output> 
    </xsl:template> 
    <xsl:template match="foo"> 
    <node> 
     <xsl:value-of select="@name"/> 
    </node> 
    <xsl:apply-templates/> 
    </xsl:template> 
</xsl:stylesheet> 

然而,上述变换的实际结果包括四个<node/>元件,其中两个包含文本nested。这意味着第二个模板也适用于最内层的节点。但是根据上述步骤3,处理引擎不应该到达这些节点。

我测试了多个Web浏览器中的转换,并使用Notepad ++ XML Tools插件,并且它们都显示“错误”结果。所以我想我错了,但是我的推理有什么问题?

回答

3

但酒吧节点做匹配模板,它们匹配内置的“*”模板,它传播的模板,调用内酒吧/节点模板

+0

你是对的,我不知道[内置模板](http://www.w3.org/TR/xslt#built-in-rule)。谢谢。 – 2010-07-20 08:07:40

1

您的假设是模板匹配是根据嵌套级别完成的。不是这种情况。

<xsl:template match="foo"> 

这符合所有foo元素,无论其嵌套级别,因此调用apply-templates时,所有foo元素将使用这个模板。

built in template rules也将导致bar节点匹配。

+0

是,模板会匹配所有''元素,不管嵌套水平如何。但'apply-templates' *会考虑嵌套层次。所以没有提到内置的模板,你的答案稍微不准确。 – 2010-07-20 08:19:38

+0

@Niels - 够公平的。将更新答案。 – Oded 2010-07-20 08:28:29

相关问题