XSLT в HTML для случая ниже - PullRequest
0 голосов
/ 09 мая 2018

Я практикую XSLT и пытаюсь достичь сценария ниже, используя XSLT. Пожалуйста, помогите: -)

У меня есть ниже входной XML:

<Items>
<item><lineType>STX</lineType></item>
<item><lineType>STZ</lineType></item>
<item><lineType>STY</lineType></item>
<item><lineType>STY</lineType></item>
<item><lineType>STZ</lineType></item>
<item><lineType>STX</lineType></item>
</Items>

Я хочу отобразить выше XML как ниже формат таблицы HTML:

Пример:

 Banner - 1
  STX
  STX

 Banner - 2
  STY
  STY

 Banner - 3
  STZ
  STZ

1 Ответ

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

Следующий код XSLT-2.0 удовлетворит ваши потребности:

<?xml version="2.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*" />                <!-- remove spaces between elements -->

    <xsl:template match="Items">
        <xsl:for-each-group select="item" group-by="lineType">
            <xsl:sort select="lineType" />          <!-- sort output alphabetically -->
            <xsl:value-of select="concat('Banner - ',position(),'&#xa;')" />
            <xsl:for-each select="current-group()"> <!-- iterate over the elements of the current group -->
                <xsl:value-of select="concat(.,'&#xa;')" />
            </xsl:for-each>
        </xsl:for-each-group>
    </xsl:template>

</xsl:stylesheet>

С другой стороны, XSLT-1.0 - это следующий шаблон, использующий концепцию Muenchian Grouping:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:key name="unique" match="item" use="lineType" />
    <xsl:strip-space elements="*" />

    <xsl:template match="Items">
        <xsl:for-each select="item[generate-id() = generate-id(key('unique',lineType)[1])]">
            <xsl:sort select="lineType" />
            <xsl:value-of select="concat('Banner - ',position(),'&#xa;')" />
            <xsl:for-each select="key('unique',lineType)">
                <xsl:value-of select="concat(.,'&#xa;')" />
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

Выход в обоих случаях:

Banner - 1
STX
STX
Banner - 2
STY
STY
Banner - 3
STZ
STZ
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...