XML / XSLT嵌套的属性循环,用于生成HTML表

时间:2016-03-03 08:33:06

标签: html xml xslt

我正在尝试从我通过SQL查询获得的某些XML生成HTML表。生成的XML如下所示:

<root>
<form attribute1="1" attribute2="1" />
<form attribute1="1" attribute2="2" />
<form attribute1="1" attribute2="3" />
<form attribute1="2" attribute2="1" />
<form attribute1="2" attribute2="2" />
<form attribute1="3" attribute2="1" />
</root>

我想要生成的表需要为每个唯一的attribute1设置一个标题行,每个attribute2下面都有行,如下所示:

<attribute1="1" />
<attribute2="1" />
<attribute2="2" />
<attribute2="3" />

<attribute1="2" />
<attribute2="1" />
<attribute2="2" />

<attribute1="3" />
<attribute2="1" />

我没有太多使用XML / XSLT的经验,但我希望可以做一些像循环遍历表单的事情,为每个唯一的attribute1创建一个标题行,然后创建与下面的唯一attribute1相关联的数据行。

1 个答案:

答案 0 :(得分:0)

如果您只能使用XSLT 1.0,请尝试使用此XSLT作为初学者,它使用Muenchian分组方法

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

  <xsl:key name="form" match="form" use="@attribute1" />

  <xsl:template match="root">
    <xsl:copy>
        <!-- Get first "form" element that occurs in each group -->
        <xsl:for-each select="form[generate-id() = generate-id(key('form',@attribute1)[1])]">
          <group>
            <header><xsl:value-of select="@attribute1" /></header>
            <!-- Get the "form" elements that make up the group -->
            <xsl:apply-templates select="key('form', @attribute1)" />
          </group>
        </xsl:for-each>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="form">
    <row><xsl:value-of select="@attribute2" /></row>
  </xsl:template>
</xsl:stylesheet>

这里有一些可以创建HTML表的XSLT。这个稍微高一点,因为它计算出一行的最大列数,并在为较短的行创建colspan属性时使用它

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

  <xsl:key name="form" match="form" use="@attribute1" />

    <xsl:variable name="maxCells">
        <xsl:for-each select="/root/form[generate-id() = generate-id(key('form',@attribute1)[1])]">
            <xsl:sort select="count(key('form', @attribute1))" order="descending" />
            <xsl:if test="position() = 1">
                <xsl:value-of select="count(key('form', @attribute1))" />
            </xsl:if>
        </xsl:for-each>
    </xsl:variable>

  <xsl:template match="root">
    <table border="1">
        <!-- Get first "form" element that occurs in each group -->
        <xsl:for-each select="form[generate-id() = generate-id(key('form',@attribute1)[1])]">
            <tr>
                <th colspan="{$maxCells}">
                    <xsl:value-of select="@attribute1" />
                </th>
            </tr>
            <tr>
            <!-- Get the "form" elements that make up the group -->
                <xsl:apply-templates select="key('form', @attribute1)" />
            </tr>
        </xsl:for-each>
    </table>
  </xsl:template>

  <xsl:template match="form">
    <td>
        <xsl:if test="position() = last()">
            <xsl:attribute name="colspan">
                <xsl:value-of select="$maxCells - count(key('form', @attribute1)) + 1" />
            </xsl:attribute>
        </xsl:if>
        <xsl:value-of select="@attribute2" />   
    </td>
  </xsl:template>
</xsl:stylesheet>