2014-02-06 34 views
0

我在为考试学习XSLT和XML。我有这个XML文档:xslt输出值的疑惑

<?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> 

你能解释我为什么在outupt我也有标签“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> 

回答

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 />并添加匹配的文本()节点,然后忽略,而不是让内置的模板过程中他们的模板。

<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,顺便!

+0

非常感谢你的帮助! :) – testermaster