XSL - создание нескольких таблиц в соответствии с различными значениями дочернего узла XML - PullRequest
0 голосов
/ 07 мая 2018

Я пытался преобразовать следующий 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 в одну таблицу, но я пытаюсь разбить его на несколько таблиц - разные таблицы для каждого тега "Страна" (т. Е. Таблица для альбомов из США, другая таблица для альбомов из Великобритании так далее.). Как я могу это сделать?

Я часами пытался реализовать несколько методов, которые нашел, но мне кажется, что ничего не работает (вероятно, из-за моего отсутствия знаний по XSL ...). Я буду очень благодарен за небольшое руководство здесь. Спасибо!

1 Ответ

0 голосов
/ 07 мая 2018

Вы можете попробовать следующий шаблон, используя метод Мюнхена - способ группировки элементов XSLT-1.0, хорошо работающий в веб-браузерах , таких как 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...