XSL for-each迭代

时间:2013-01-19 14:03:52

标签: xml xslt foreach

我有两个for-each语句迭代,我希望输出在表格中是垂直格式而不是水平格式。

目前输出:

a b c
1 2 3

我希望它输出:

a 1
b 2
c 3

有人可以帮忙吗?这是XSL:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" indent="no"/>
    <xsl:key name="names" match="Niche" use="."/>
    <xsl:key name="niche" match="row" use="Niche"/>

        <xsl:template match="/">
            <table border="1">

                <xsl:for-each select="//Niche[generate-id() = generate-id(key('names',.)[1])]">
                <xsl:sort select="."/>

                    <td>
                    <xsl:value-of select="."/>
                    </td>
                </xsl:for-each>

                <td><tr></tr></td>

                <xsl:for-each select="//row[generate-id(.)=generate-id(key('niche', Niche)[1])]">
                <xsl:sort select="Niche"/>

                    <td>
                    <xsl:value-of select="count(key('niche', Niche))"/>
                    </td>
                </xsl:for-each>

            </table>

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

示例XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="sample.xsl" ?>
<root>
    <row>
        <Niche>a</Niche>
    </row>
    <row>
        <Niche>b</Niche>
    </row>
    <row>
        <Niche>b</Niche>
    </row>
    <row>
        <Niche>c</Niche>
    </row>
    <row>
        <Niche>c</Niche>
    </row>
    <row>
        <Niche>c</Niche>
    </row>
</root>

1 个答案:

答案 0 :(得分:2)

我很确定您需要做的就是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="no"/>
  <xsl:key name="niche" match="Niche" use="."/>

  <xsl:template match="/">
    <table border="1">

      <xsl:for-each select="//Niche[generate-id(.)=generate-id(key('niche', .)[1])]">
        <xsl:sort select="."/>
        <tr>
          <td>
            <xsl:value-of select="."/>
          </td>
          <td>
            <xsl:value-of select="count(key('niche', .))"/>
          </td>
        </tr>
      </xsl:for-each>

    </table>

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

但请提供示例输入XML,以便我们验证。

在样本输入上,这会产生:

<table border="1">
  <tr>
    <td>a</td>
    <td>1</td>
  </tr>
  <tr>
    <td>b</td>
    <td>2</td>
  </tr>
  <tr>
    <td>c</td>
    <td>3</td>
  </tr>
</table>

要从最高到最低出现次数排序,您可以替换此行:

<xsl:sort select="."/>

用这个:

<xsl:sort select="count(key('niche', .))" order="descending" data-type="number"/>