Xsl 1.0,双重分组

时间:2017-11-28 14:44:57

标签: xslt

我有一个xsl模板,按类别对项目进行分组。现在我想在这些类别中将它们组合在一起。

我的xsl脚本:

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

  <xsl:variable name="prefix_param">udt_<xsl:value-of select="//udt:Context/udt:ModuleId" />_param</xsl:variable>
  <xsl:key name="data-by-Category" match="udt:Data" use="udt:Category" />

  <xsl:template match="udt:Data" mode="list">
    <li>
        <xsl:value-of select="udt:Subcategory" disable-output-escaping="yes" />
        <xsl:value-of select="udt:Information" disable-output-escaping="yes" />
    </li>
  </xsl:template>

  <xsl:template match="/udt:UserDefinedTable">
    <xsl:for-each select="udt:Data[count(. | key('data-by-Category', udt:Category)[1]) = 1]">
      <xsl:sort select="udt:Zap" />
      <span>
        <h1>
          <xsl:value-of select="udt:Category" disable-output-escaping="yes" />&#160;</h1>
      </span>
      <xsl:variable name="currentData" select="key('data-by-Category', udt:Category)" />
      <xsl:if test="$currentData">
        <ul>
          <xsl:apply-templates select="$currentData" mode="list">
            <xsl:sort select="udt:PodCategory" order="ascending" /> 
          </xsl:apply-templates>
        </ul>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>

  <xsl:template name="EditLink">
    <xsl:if test="udt:EditLink">
      <a href="{udt:EditLink}">
        <img border="0" alt="edit" src="{//udt:Context/udt:ApplicationPath}/images/edit.gif" />
      </a>
    </xsl:if>
  </xsl:template>

我现在得到的样本输出:

<h1>Category 1</h1>
<ul>
<li>Subcategory 1 info 1</li>
<li>Subcategory 2 info 1</li>
<li>Subcategory 2 info 2</li>
<li>Subcategory 2 info 3</li>
</ul>

<h1>Category 2</h1>
<ul>
<li>Subcategory 1 info 1</li>
<li>Subcategory 1 info 2</li>
<li>Subcategory 2 info 1</li>
</ul>

这是我想要实现的示例输出:

<h1>Category 1</h1>
<h2>Subcategory 1</h2>
<ul>
<li>info 1</li>
</ul>
<h2>Subcategory 2</h2>
<ul>
<li>info 1</li>
<li>info 2</li>
<li>info 3</li>
</ul>

<h1>Category 2</h1>
<h2>Subcategory 1</h2>
<ul>
<li>info 1</li>
<li>info 2</li>
</ul>
<h2>Subcategory 1</h2>
<ul>
<li>info 1</li>
</ul>

我想在一个辅助组中对每个组内的项进行gtoup并显示其标题。

1 个答案:

答案 0 :(得分:0)

定义第二个键

<xsl:key name="data-by-Category-and-Subcategory" match="udt:Data" use="concat(udt:Category, '|', udt:Subcategory)" />

然后使用例如那是为了识别子群

  <xsl:template match="/udt:UserDefinedTable">
    <xsl:for-each select="udt:Data[count(. | key('data-by-Category', udt:Category)[1]) = 1]">
      <xsl:sort select="udt:Zap" />
      <span>
        <h1>
          <xsl:value-of select="udt:Category" disable-output-escaping="yes" />&#160;</h1>
      </span>
      <xsl:variable name="currentData" select="key('data-by-Category', udt:Category)" />
      <xsl:for-each select="$currentData[generate-id() = generate-id(key('data-by-Category-and-Subcategory', concat(udt:Category, '|', udt:Subcategory))[1])]">
         <h2><xsl:value-of select="udt:Subcategory"/></h2>
         <xsl::variable name="$sub-group" select="key('data-by-Category-and-Subcategory', concat(udt:Category, '|', udt:Subcategory)"/>

        <ul>
          <xsl:apply-templates select="$sub-group" mode="list">
            <xsl:sort select="udt:PodCategory" order="ascending" /> 
          </xsl:apply-templates>
        </ul>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>