xslt值 - 输出疑点

时间:2014-02-06 22:54:07

标签: xml xslt value-of

我正在研究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>

1 个答案:

答案 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中选择音乐的加分点!