XSLT分组和子分组

XSLT分组和子分组,xslt,muenchian-grouping,xsl-grouping,Xslt,Muenchian Grouping,Xsl Grouping,我有以下代码: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" /> <xsl:key name="categories" match="Category" use="." /> <xsl:key name="clients" match="Category" use =

我有以下代码:

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

  <xsl:key name="categories" match="Category" use="." />
  <xsl:key name="clients" match="Category" use ="Category/Client" />

  <xsl:template match="/">
    <ul id="red" class="treeview-red">
      <xsl:for-each select="/Promotions/Promotion/Category[  
        generate-id(.) = generate-id(key('categories', .)[1])  
      ]">
        <xsl:variable name="cname" select="." />

        <li>
          <span>
            <xsl:value-of select="$cname" />
          </span>

          <xsl:for-each select="/Promotions/Promotion[Category=$cname]">
            <ul>
              <li>
                <span>
                  <xsl:value-of select="Client" />
                </span>
              </li>
              <ul>
                <li>
                  <span>
                    <xsl:value-of select="Title" />
                  </span>
                </li>
              </ul>
            </ul>
          </xsl:for-each>
        </li>
      </xsl:for-each>

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

我的XML:

<Promotions>
  <Promotion>
    <Category>Arts &amp; Entertainment</Category>
    <Client>Client 1</Client>
    <Title>Get your Free 2</Title>
  </Promotion>
  <Promotion>
    <Category>Arts &amp; Entertainment</Category>
    <Client>Client 1</Client>
    <Title>Get your Free 4</Title>
  </Promotion>
  <Promotion>
    <Category>Arts &amp; Entertainment</Category>
    <Client>Client 1</Client>
    <Title>Get your Free 5</Title>
  </Promotion>
  <Promotion>
    <Category>Community &amp; Neighborhood</Category>
    <Client>Client 2</Client>
    <Title>Get your Free 1</Title>
  </Promotion>
  <Promotion>
    <Category>Education</Category>
    <Client>Client 3</Client>
    <Title>Get Your Free 3</Title>
  </Promotion>
</Promotions>

艺术及文化事务;游戏娱乐
客户1
得到你的免费2
艺术及文化事务;游戏娱乐
客户1
得到你的免费4
艺术及文化事务;游戏娱乐
客户1
得到你的免费5
社区及;邻里
客户2
获得免费1
教育类
客户3
得到你的免费3
它的输出如下:

<ul id="red" class="treeview-red">
  <li><span>Arts &amp; Entertainment</span><ul>
      <li><span>Client 1</span></li>
      <ul>
        <li><span>Get your Free 2</span></li>
      </ul>
    </ul>
    <ul>
      <li><span>Client 1</span></li>
      <ul>
        <li><span>Get your Free 4</span></li>
      </ul>
    </ul>
    <ul>
      <li><span>Client 1</span></li>
      <ul>
        <li><span>Get your Free 5</span></li>
      </ul>
    </ul>
  </li>
  <li><span>Community &amp; Neighborhood</span><ul>
      <li><span>Client 2</span></li>
      <ul>
        <li><span>Get your Free 1</span></li>
      </ul>
    </ul>
  </li>
  <li><span>Education</span><ul>
      <li><span>Client 3</span></li>
      <ul>
        <li><span>Get Your Free 3</span></li>
      </ul>
    </ul>
  </li>
</ul>
  • 艺术及文化事务;娱乐
    • 客户1
      • 得到你的免费2
    • 客户1
      • 得到你的免费4
    • 客户1
      • 得到你的免费5
  • 社区及;邻里
    • 客户2
      • 获得免费1
  • 教育
    • 客户3
      • 得到你的免费3
我希望输出首先按类别进行分组,然后按客户机对每个类别进行分组,对此有任何见解都会很好:

<ul id="red" class="treeview-red">
  <li><span>Arts &amp; Entertainment</span><ul>
      <li><span>Client 1</span></li>
      <ul>
        <li><span>Get your Free 2</span></li>
      </ul>
      <ul>
        <li><span>Get your Free 4</span></li>
      </ul>
      <ul>
        <li><span>Get your Free 5</span></li>
      </ul>
    </ul>
  </li>
  <li><span>Community &amp; Neighborhood</span><ul>
      <li><span>Client 2</span></li>
      <ul>
        <li><span>Get your Free 1</span></li>
      </ul>
    </ul>
  </li>
  <li><span>Education</span><ul>
      <li><span>client 3</span></li>
      <ul>
        <li><span>Get Your Free 3</span></li>
      </ul>
    </ul>
  </li>
</ul>
  • 艺术及文化事务;娱乐
    • 客户1
      • 得到你的免费2
      • 得到你的免费4
      • 得到你的免费5
  • 社区及;邻里
    • 客户2
      • 获得免费1
  • 教育
    • 客户3
      • 得到你的免费3

基本上,在按类别分组后,我只希望看到该类别下的一个客户机以及该类别中该客户机的每次升级。

如果看不到XML输入,很难建议对样式表进行更改,因此目前我所能做的就是将其作为XSLT 1.0的多级分组示例

[编辑]:以下是如何应用两级慕尼黑分组:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="html" indent="yes"/>

  <xsl:key name="k1" match="Promotion" use="Category"/>
  <xsl:key name="k2" match="Promotion" use="concat(Category, '|', Client)"/>

  <xsl:template match="Promotions">
    <ul id="red" class="treeview-red">
      <xsl:for-each select="Promotion[generate-id() = generate-id(key('k1', Category)[1])]">
        <li>
          <span>
            <xsl:value-of select="Category"/>
          </span>
          <xsl:for-each select="key('k1', Category)[generate-id() = generate-id(key('k2', concat(Category, '|', Client))[1])]">
            <ul>
              <li>
                <span>
                  <xsl:value-of select="Client"/>
                </span>
                <xsl:for-each select="key('k2', concat(Category, '|', Client))">
                  <ul>
                    <li>
                      <span>
                        <xsl:value-of select="Title"/>
                      </span>
                    </li>
                  </ul>
                </xsl:for-each>
              </li>
            </ul>
          </xsl:for-each>
        </li>
      </xsl:for-each>
    </ul>
  </xsl:template>

</xsl:stylesheet>


查看源xml以及您想要得到的结果的xml结构将非常有帮助。接受答案,因为这正是我想要的。我已经编辑了我的问题,虽然你给我指出了正确的方向,但我无法让它正常工作,请告诉我