2009-12-31 133 views
2

我对XSLT apply-template语句感到困惑。例如,在w3school中。XSLT模板匹配问题

http://www.w3schools.com/xsl/xsl_apply_templates.asp

要提到的 - “的<xsl:apply-templates>元素应用模板到当前元素或当前元素的子节点。”,我的问题是,它是否适用于当前元素或子节点或都? “或”这个词让我对它的明确行为感到困惑。

编辑1:这里是代码片段我很困惑,我很困惑,当xslt处理器发现<xsl:apply-templates/>时,它会匹配“当前节点”的所有子节点。这里“当前节点”是指目录还是其他虚拟抽象XML根节点?为什么?

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

由于事先 乔治

回答

2

w3schools文档并不是全部被破解的,我同意,在这种情况下这是相当具有误导性的。

细则中指出:

在没有选择属性,在xsl:应用模板指令处理所有当前节点的子节点,包括文本节点。

XML中的“儿童”总是指直接的孩子。儿童的孩子等被称为“后代”。

“当前节点”就是这个意思。这取决于apply-templates指令出现的上下文。

所以最初你可能有:

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

这里当前节点是文档节点,应用模板将作用于孩子们一道,即XML的顶级元素。

在此示例:

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

当前节点将是一个节点在什么地方被称为“CD”的XML和应用模板会作用的,直接的儿童。

注意这方面的需求并不适用于元素称为“CD”,也没有在实际上需要将其应用到任何元素称为“CD”,这将取决于如何其他模板在XSLT处理输入XML。它所说的是,只要该模板匹配,当前节点将是一个“cd”节点。

+0

感谢您的帮助,我已更新我的帖子中EDIT1部分的更多疑惑,还有哪些意见? – George2 2010-01-01 05:25:13

+1

在你的例子中,当前节点是文档节点。它既不虚拟也不抽象。它是DOM的最顶层节点和目录元素的父节点。所以apply-templates指令将只选择一个且唯一的“目录”元素。 – Alohci 2010-01-01 11:22:37

+0

谢谢,问题回答! – George2 2010-01-01 16:01:58

1

<xsl:apply-templates/>当前节点的所有子节点相匹配。

在例如

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

当前节点(/)是目录(根节点)。因此将应用匹配所有子节点(cd,标题,艺术家,国家,...)(如果它们存在)的模板。

您理解的最佳方法是更改​​示例中的xslt并观察您获得的各种输出。

一种方法是删除所有其他3个模板(cd,艺术家&标题)并再次运行xslt。

+0

感谢您的帮助,我已经更新了我的帖子的EDIT1部分,还有其他意见吗? – George2 2010-01-01 05:28:03

2

在你想要的模板应用到当前元素,用例:

<xsl:apply-templates select="."/> 
+0

感谢您的帮助,我更新了我的帖子中EDIT1部分的更多疑惑,还有哪些意见? – George2 2010-01-01 05:25:49

1

我的问题是它是否适用于 当前元素或子节点 或两者兼而有之?

这取决于apply-templates元素中是否存在选择属性。

如果它只是<xsl:apply-templates/>那么匹配当前元素的子节点的模板将被应用。在w3Schools的情况下,这意味着cd,标题和艺术家都得到应用。

但是,如果您要执行类似<xsl:apply-templates select="/catalog/cd/artist"/>的操作,则只有该元素才能将模板应用于该模板。

+0

感谢您的帮助,我更新了我的帖子中EDIT1部分的更多疑惑,还有哪些意见? – George2 2010-01-01 05:27:31