0

試験のために 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>
4

1 に答える 1

1

これは、XSLTにテンプレート ルールが組み込まれているためです。これらは、XSLT 内のノードに一致するテンプレートが見つからない場合に XSLT によって使用されるテンプレートです。要素 (およびドキュメント ノード) の場合、組み込みテンプレートはそれを出力しませんが、その子に一致するテンプレートを探します。テキストノードの場合、テキストを出力します。

XSLT では、これを行うことから始めます。

<xsl:apply-templates />

これにより、XSLT はドキュメント ノードの子 (この場合はlistacd ) に一致するテンプレートを検索します。これに一致するテンプレートがないため、組み込みのテンプレートが使用されます。これらは引き続き、artistanomeのマッチングに使用され、テキストが出力されます。

1 つの解決策は、 を this に置き換えて、<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 での音楽の選択にはボーナス ポイントがあります。

于 2014-02-06T23:04:53.887 に答える