2

以下は、変換する必要のある元のXMLファイルです。これは、アルバムを発行年の昇順で並べ替えたHTMLテーブルに変換する必要がある音楽アルバムレコードのリストであり、個々のレコード要素に含まれるジャンルとレコードレーベル要素を次のように関連付ける必要があります。 id参照を参照し、アルバムごとにテーブルに出力します。

2番目の変換では、基本的に同じことを行う必要がありますが、その場合、出力にはロックとポップのジャンルのアルバムのみを含める必要があります。

    <?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="zadacha1.xsl" ?>
<record_collection>
    <genres>
        <genre id="1">Rock</genre>
        <genre id="2">Pop</genre>
        <genre id="3">Disco</genre>
        <genre id="4">Rap</genre>
        <genre id="5">Electronic</genre>
        <genre id="6">Country</genre>
    </genres>

    <record_labels>
        <record_label id="1">DGC Records</record_label>
        <record_label id="2">Atlantic</record_label>
        <record_label id="3">Epic</record_label>
        <record_label id="4">Warner Bros.</record_label>
        <record_label id="5">EMI</record_label>
        <record_label id="6">Columbia</record_label>
    </record_labels>

    <records>
        <record>
            <artist>Nirvana</artist>
            <genreID>1</genreID>
            <album>Nevermind</album>
            <year_of_issue>1992</year_of_issue>
            <record_labelID>1</record_labelID>
        </record>

        <record>
            <artist>Twisted Sister</artist>
            <genreID>1</genreID>
            <album>Stay Hungry</album>
            <year_of_issue>1984</year_of_issue>
            <record_labelID>2</record_labelID>
        </record>   

        <record>
            <artist>Michael Jackson</artist>
            <genreID>2</genreID>
            <album>Thriller</album>
            <year_of_issue>1982</year_of_issue>
            <record_labelID>3</record_labelID>
        </record>   

        <record>
            <artist>Bee Gees</artist>
            <genreID>3</genreID>
            <album>Spirits Having Flown</album>
            <year_of_issue>1979</year_of_issue>
            <record_labelID>4</record_labelID>
        </record>   

        <record>
            <artist>Ice-T</artist>
            <genreID>4</genreID>
            <album>O.G. Original Gangster</album>
            <year_of_issue>1991</year_of_issue>
            <record_labelID>4</record_labelID>
        </record>

        <record>
            <artist>Kraftwerk</artist>
            <genreID>5</genreID>
            <album>Computer World</album>
            <year_of_issue>1981</year_of_issue>
            <record_labelID>5</record_labelID>
        </record>

        <record>
            <artist>Johnny Cash</artist>
            <genreID>6</genreID>
            <album>Man in Black</album>
            <year_of_issue>1971</year_of_issue>
            <record_labelID>6</record_labelID>
        </record>

    </records>
</record_collection>

私が管理できたのは、ジャンルとレコードレーベルの要素なしで並べ替えられていないテーブルを出力することでした。これらは個々のレコードのIDを介してリンクされており、IDに到達してIDの後ろにテキストを出力する方法がわからないためです。これが、XSLT変換として今まで持っているものです。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/record_collection/records">
        <html>
         <head>
            <title>Records Collection</title>
         </head>
         <body>
            <h1>Records Collection</h1>
            <table border="1">
                <tr>
                    <th>Genre</th>
                    <th>Artist</th>
                    <th>Album</th>
                    <th>Year</th>
                    <th>Label</th>
                </tr>

                <xsl:apply-templates select="record" />
            </table>
            <xsl:call-template name="footer" />
         </body>
        </html>
    </xsl:template>

    <xsl:template match="record">
        <tr>
            <td>?</td>
            <td><xsl:value-of select="artist" /></td>
            <td><xsl:value-of select="album" /></td>
            <td><xsl:value-of select="year_of_issue" /></td>
            <td>?</td>
        </tr>
    </xsl:template>


    <xsl:template name="footer">
        <div style="margin: 20px 0; padding: 10px; background-color: #efefef; ">
            Record Collection
        </div>
    </xsl:template>

</xsl:stylesheet>
4

2 に答える 2

2

あなたはただ使用する必要があります:

<xsl:apply-templates select="record">
    <xsl:sort select="year_of_issue" order="ascending" data-type="number"/>
</xsl:apply-templates>

それ以外の

<xsl:apply-templates select="record"/>

表は発行年の昇順で並べ替えられます

于 2012-11-27T15:12:10.720 に答える
1

これは、xsl:keyジャンルを検索してレーベルを記録するために使用するのに適した場所です。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <xsl:apply-templates select="/record_collection/records"></xsl:apply-templates>
    </xsl:template>

    <xsl:key name="genre-lookup" match="/record_collection/genres/genre" use="@id"/>
    <xsl:key name="record_label" match="/record_collection/record_labels/record_label" use="@id"/>

    <xsl:template match="records">
        <html>
            <head>
                <title>Records Collection</title>
            </head>
            <body>
                <h1>Records Collection</h1>
                <table border="1">
                    <tr>
                        <th>Genre</th>
                        <th>Artist</th>
                        <th>Album</th>
                        <th>Year</th>
                        <th>Label</th>
                    </tr>

                    <xsl:apply-templates select="record" />
                </table>
                <xsl:call-template name="footer" />
            </body>
        </html>
    </xsl:template>

    <xsl:template match="record">
        <tr>
            <td>
                <xsl:value-of select="key('genre-lookup',genreID)" />
            </td>
            <td>
                <xsl:value-of select="artist" />
            </td>
            <td>
                <xsl:value-of select="album" />
            </td>
            <td>
                <xsl:value-of select="year_of_issue" />
            </td>
            <td>
                <xsl:value-of select="key('record_label',record_labelID)" />
            </td>
        </tr>
    </xsl:template>


    <xsl:template name="footer">
        <div style="margin: 20px 0; padding: 10px; background-color: #efefef; ">
            Record Collection
        </div>
    </xsl:template>

</xsl:stylesheet>

RockまたはPopでフィルタリングするだけの場合は、次のようapply-templatesにフィルタリングするように調整しgenreId = 1 / 2ます。

<xsl:apply-templates select="record[genreID=1 or genreID=2]" />

元のxsltに対する小さな変更の1つは、デフォルトの処理命令がドキュメントに適用されないようにするために、ルートをキャプチャすることです。

于 2012-11-27T14:49:34.357 に答える