2014-02-06 37 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