XSLT模板选择和匹配问题

时间:2010-01-01 16:10:27

标签: html xslt

我很担心这个XSLT apply-template语句如何适用于w3school样本中的cd / title / artist元素,

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

这是我感到困惑的代码片段,当xslt处理器在下面的示例中找到<xsl:apply-templates/>时,我很困惑,它会匹配“当前节点”的所有子节点,即文档根的子节点和子节点节点应该是目录节点。但是在XSLT文件中,没有匹配目录的模板,只匹配cd / title / artist。

以下模板是否与<xsl:apply-templates/>中的目录节点匹配后,有人可以告诉我,请问如何处理目录的子节点?

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <xsl:apply-templates/>
  </body>
  </html>
</xsl:template>
提前谢谢, 乔治

4 个答案:

答案 0 :(得分:1)

如果没有模板匹配<xsl:apply-templates/>,那么将调用所有子元素的默认操作,这相当于:

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

<xsl:template match="text()">
  <xsl:value-of select="."/>
</xsl:template>

换句话说,复制文本节点,删除源文档的元素。在w3c-schools示例中,这会导致<catalog>元素被删除。该示例包含<catalog>元素的子元素的模板,然后进行处理。

答案 1 :(得分:1)

它不只是查看树的下一级,而是查看整个层次结构。 “cd”的match属性(与“/ cd”相对)匹配层次结构中的任何位置,因此匹配catalog元素下的那些。

答案 2 :(得分:1)

查看示例,XSL继续使用以下模板

<xsl:template match="cd">
  <p>
    <xsl:apply-templates select="title"/>  
    <xsl:apply-templates select="artist"/>
  </p>
</xsl:template>

<xsl:template match="title">
  Title: <span style="color:#ff0000">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

第一个模板中的apply-template将与match="cd"的模板匹配,因为目录中包含cd元素。然后,此模板与标题和艺术家模板(按此顺序)匹配,因为这些节点存在于CD级别。

匹配发生在当前上下文级别 - 当上下文从/catalog移动到/catalog/cd/catalog/cd/title/catalog/cd/title时,相关模板匹配并执行。

答案 3 :(得分:0)

该页面中的xslt代码是可疑的,因为它仅适用于该页面上的特定XML。

因此在代码段中

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

由于Apply模板中没有select属性,因此处理器将检查root下的任何元素。碰巧的情况是,除了下的之外,没有其他元素看起来可以正常工作。如果添加以外的其他元素,并在下添加一些文本内容,则xslt将无法像宣传的那样工作。这些多余的文字将会出现。

另一方面,如果将apply-templates更改为此,即使有非兄弟姐妹也可以使用。

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

顺便说一句,这是更新的页面链接https://www.w3schools.com/xml/xsl_apply_templates.asp