我很担心这个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>
提前谢谢,
乔治
答案 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下的任何元素。碰巧的情况是,除了
另一方面,如果将apply-templates更改为此,即使有非
<xsl:apply-templates select="//cd"/>
顺便说一句,这是更新的页面链接https://www.w3schools.com/xml/xsl_apply_templates.asp