XSL - 根据XML子节点的不同值创建多个表

时间:2018-05-07 20:26:12

标签: xml xslt

我尝试根据特定子节点的值将以下XML文档转换为多个表。以下是我的XML的样子:

<?xml version="1.0" encoding="ISO8859-1"?>
<?xml-stylesheet type="text/xsl" href="AlbumsTranformedToXSL.xsl"?>
<!--<?xml-stylesheet type="text/xsl" href="addCountryAttribute.xsl"?>-->

<Albums>
	<Album>
		<Name>Empire Burlesque</Name>
		<Artist>Bob Dylan</Artist>
		<Country>USA</Country>
		<Company>Columbia</Company>
		<Date>19880610</Date>
	</Album>
	<Album>
		<Name>Hide your heart</Name>
		<Artist>Bonnie Tylor</Artist>
		<Country>UK</Country>
		<Company>CBS Records</Company>
		<Price>9.90</Price>
		<Date>19880509</Date>
	</Album>
</Albums>

这是我目前的XSL:

<?xml version='1.0' encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
        <body>
            <table border="2" bgcolor="transparent">
                <tr bgcolor="grey">
                    <th>Artist</th>
                    <th>Title</th>
                </tr>
                <xsl:for-each select="Albums/Album">
                    <xsl:sort select="Date" />
                    <!--printing table-->
                    <tr>
                        <td>
                            <xsl:value-of select="Artist" />
                        </td>
                        <td>
                            <xsl:value-of select="Name" />
                        </td>
                    </tr>
                </xsl:for-each>
            </table>
        </body>

        </html>
    </xsl:template>
</xsl:stylesheet>

目前我的XSL将XML转换为一个表,但我试图将其拆分为几个表 - 每个“Country”标签的一个不同的表(即来自美国的专辑表,另一个来自英国专辑的表)等等。)。我怎样才能实现呢?

我花了好几个小时试图实现我发现的几种方法,但似乎没有什么对我有用(可能是由于我缺乏XSL知识......)。我将非常感谢这里的一点指导。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用 Muenchian方法尝试以下模板 - 一种XSLT-1.0方法,可以将 WebBrowsers 中的元素分组,如 Firefox IE Chrome

<?xml version='1.0' encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="country" match="Album" use="Country" />

    <xsl:template match="/Albums">
        <html>
        <body>
            <xsl:for-each select="Album[generate-id() = generate-id(key('country',Country)[1])]">
                <table border="2" bgcolor="transparent">
                    <tr bgcolor="grey">
                        <th>Artist</th>
                        <th>Title</th>
                    </tr>
                    <xsl:for-each select="key('country',Country)">
                        <xsl:sort select="Date" order="ascending"/>   <!-- here you decide what elements are at the top -->
                        <!--printing table-->
                        <tr>
                            <td>
                                <xsl:value-of select="Artist" />
                            </td>
                            <td>
                                <xsl:value-of select="Name" />
                            </td>
                        </tr>
                    </xsl:for-each>
                </table>
            </xsl:for-each>
        </body>    
        </html>
    </xsl:template>
</xsl:stylesheet>

上述模板会将您的元素排序为两个表。每个Country示例一个。如果你有更多的国家,那么当然会有更多的表格。元素的顺序由xsl:sort中的xsl:for-each决定。