XSLT模板匹配问题

时间:2009-12-31 07:50:54

标签: html xslt

我对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>
提前谢谢, 乔治

4 个答案:

答案 0 :(得分:2)

如果要将模板应用于当前元素,请使用:

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

答案 1 :(得分:2)

w3schools的文件并非完全没有被证实,我同意,在这种情况下这是非常误导的。

规范说:

  

如果没有select属性,xsl:apply-templates指令将处理当前节点的所有子节点,包括文本节点。

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

“当前节点”就是这个意思。它取决于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"/>之类的操作,那么只有该元素才会将模板应用于它。