我对XSLT apply-template语句感到困惑。例如,在w3school。
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>
提前谢谢,
乔治
答案 0 :(得分:2)
如果要将模板应用于当前元素,请使用:
<xsl:apply-templates select="."/>
答案 1 :(得分:2)
w3schools的文件并非完全没有被证实,我同意,在这种情况下这是非常误导的。
规范说:
XML中的“儿童”总是指直接的孩子。儿童的孩子等被称为“后代”。如果没有select属性,xsl:apply-templates指令将处理当前节点的所有子节点,包括文本节点。
“当前节点”就是这个意思。它取决于apply-templates指令出现的上下文。
所以最初你可能有:
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
此处当前节点是文档节点,apply-templates将作用于子节点,即XML的顶级元素。
在此示例中:
<xsl:template match="cd">
<xsl:apply-templates />
</xsl:template>
当前节点将是XML中名为“cd”的某个节点,apply-templates将作用于其直接子节点。
请注意,这不一定适用于每个名为“cd”的元素,实际上也不需要将它应用于任何名为“cd”的元素,这取决于如何XSLT中的其他模板处理输入XML。它说的是,只要模板 匹配,当前节点就是“cd”节点。
答案 2 :(得分:1)
<xsl:apply-templates/>
匹配当前节点的所有子节点。
在例如
中<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
当前节点(/)是目录(根节点)。因此,将应用匹配所有子节点(cd,title,artist,country,...)的模板(如果存在)。
您理解的最佳方式是更改示例中的xslt并观察您获得的各种输出。
一种方法是删除所有其他3个模板(cd,artist&amp; title)并再次运行xslt。
答案 3 :(得分:1)
我的问题是它是否适用 到当前元素或子节点 或两者兼而有之?
这取决于apply-templates
元素中是否有select属性。
如果它只是<xsl:apply-templates/>
,那么将应用与当前元素的子节点匹配的模板。在w3Schools的情况下,这意味着CD,标题和艺术家都可以应用。
但是,如果您要执行类似<xsl:apply-templates select="/catalog/cd/artist"/>
之类的操作,那么只有该元素才会将模板应用于它。