对于以下情况,XSLT为HTML

时间:2018-05-09 18:59:49

标签: html xslt

我正在练习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>

我想在HTML表格格式下显示上面的XML:

示例:

 Banner - 1
  STX
  STX

 Banner - 2
  STY
  STY

 Banner - 3
  STZ
  STZ

1 个答案:

答案 0 :(得分:0)

以下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