我正在研究XSLT和XML进行考试。我有这个XML文档:
<?xml version="1.0" encoding="UTF-8"?> <!-- Prologo XML -->
<?xml-stylesheet
type="text/xsl" href="listacd_es1.xslt"?> <!-- Istruzione che indica il documento XSLT da associare -->
<listacd> <!-- Nodo Principale o Elemento Radice -->
<artista>
<nome>Stanley Jordan</nome>
<albums>
<album>
<titolo>Magic Touch</titolo>
<anno>1985</anno>
<etichetta>Blue Note</etichetta>
</album>
<album>
<titolo>Stolen Moments</titolo>
<anno>1991</anno>
<etichetta>Blue Note</etichetta>
</album>
</albums>
</artista>
<artista>
<nome>Nick Drake</nome>
<albums>
<album>
<titolo>Pink Moon</titolo>
<anno>1972</anno>
<etichetta>Island</etichetta>
</album>
<album>
<titolo>Bryter Layter</titolo>
<anno>1970</anno>
<etichetta>Island</etichetta>
</album>
<album>
<titolo>Five leaves left</titolo>
<anno>1970</anno>
<etichetta>Island</etichetta>
</album>
</albums>
</artista>
<artista>
<nome>Jeff Buckley</nome>
<albums>
<album>
<titolo>Grace</titolo>
<anno>1994</anno>
<etichetta>Columbia</etichetta>
</album>
<album>
<titolo>Mistery white boy</titolo>
<anno>2000</anno>
<etichetta>Columbia</etichetta>
</album>
</albums>
</artista>
<artista>
<nome>Joe Satriani</nome>
<albums>
<album>
<titolo>Surfing with the alien</titolo>
<anno>1987</anno>
<etichetta>Epic</etichetta>
</album>
<album>
<titolo>Not of this earth</titolo>
<anno>1988</anno>
<etichetta>Relativity</etichetta>
</album>
</albums>
</artista>
</listacd>
我正在使用这个XSLT。我想要输出的是标签“titolo”的值。
<?xml version="1.0" encoding="UTF-8"?> <!-- Prologo XML -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Applica questo template al nodo radice
indicato dal carattere / -->
<xsl:template match="/">
<html><body>
<xsl:apply-templates>
<!-- Richiama e applica gli altri template -->
</xsl:apply-templates>
</body></html>
</xsl:template>
<!-- Quando tro
va un nodo artista
applica questa regola -->
<xsl:template match="artista/albums/album">
<xsl:value-of select="titolo"></xsl:value-of>
<br />
</xsl:template>
</xsl:stylesheet>
你能解释一下我为什么在标签“nome”的价值?我的模板中没有匹配规则,但这是我收到的输出:
<html>
<body>
Stanley Jordan
Magic Touch<br>
Stolen Moments<br>
Nick Drake
Pink Moon<br>
Bryter Layter<br>
Five leaves left<br>
Jeff Buckley
Grace<br>
Mistery white boy<br>
Joe Satriani
Surfing with the alien<br>
Not of this earth<br>
</body>
</html>
答案 0 :(得分:1)
这是因为XSLT有built-in template rules。这些是XSLT使用的模板,如果它无法在XSLT中找到节点的匹配模板。对于元素(和文档节点),内置模板不会输出它,而是查找与其子元素匹配的模板。对于文本节点,它将输出文本。
在您的XSLT中,您可以从这开始
开始<xsl:apply-templates />
这将导致XSLT查找与文档节点的子节点匹配的模板,这种情况是 listacd 。由于您没有与此匹配的模板,因此使用内置模板。它们将继续用于匹配 artista ,然后 nome ,然后输出文本。
一个解决方案是用这个替换<xsl:apply-templates />
,以明确告诉XSLT要查找哪些元素。
<xsl:apply-templates select=".//album"/>
或者,保留<xsl:apply-templates />
并添加与text()节点匹配的模板,然后忽略,而不是让内置模板处理它们。
<xsl:template match="text()" />
例如,试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="artista/albums/album">
<xsl:value-of select="titolo"/>
<br/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
顺便提一下,在XML中选择音乐的加分点!