首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT - Group by 2 levels

XSLT - Group by 2 levels
EN

Stack Overflow用户
提问于 2013-05-07 02:59:40
回答 2查看 109关注 0票数 0

希望你做得很好,我有一个场景,我从一个扁平结构的服务中得到一个结果集这个结果集有经理,他的项目和每个项目中的活动

我想要将这种平面结构转换成xml,即

代码语言:javascript
复制
Grouped by Manager
    Grouped by Project
         Activities in that Project

下面是我拥有的xml

代码语言:javascript
复制
<Results>
<Result>
    <ActivityId>101</ActivityId>
    <ActivityName>T1</ActivityName>
    <ProjectId>1001</ProjectId>
    <ProjectName>Prj1</ProjectName>
    <Description>some desc</Description>
    <manager>jcooper</manager>
</Result>
<Result>
    <ActivityId>102</ActivityId>
    <ActivityName>T2</ActivityName>
    <ProjectId>1002</ProjectId>
    <ProjectName>Prj2</ProjectName>
    <Description>some desc</Description>
    <manager>jstein</manager>
</Result>
<Result>
    <ActivityId>103</ActivityId>
    <ActivityName>T3</ActivityName>
    <ProjectId>1001</ProjectId>
    <ProjectName>Prj1</ProjectName>
    <Description>some desc</Description>
    <manager>jcooper</manager>
</Result>
<Result>
    <ActivityId>104</ActivityId>
    <ActivityName>T4</ActivityName>
    <ProjectId>1002</ProjectId>
    <ProjectName>Prj2</ProjectName>
    <Description>some desc</Description>
    <manager>jcooper</manager>
</Result>
<Result>
    <ActivityId>105</ActivityId>
    <ActivityName>T5</ActivityName>
    <ProjectId>1002</ProjectId>
    <ProjectName>Prj2</ProjectName>
    <Description>some desc</Description>
    <manager>jstein</manager>
</Result>
</Results>

其中,Manager jcooper具有Prj1{that has Activity T1,T3}和prj2{has Activity T4} Manager jstein具有Prj1(具有Activity T2)和Prj2{has Activity T5}

下面是我正在尝试的格式

代码语言:javascript
复制
Manager
    List of Prjs
        List of Activities in corresponding Project

<Results>
    <ManagerWiseResult>
        <Manager>jcooper</Manager>
        <Project>
            <ProjectId>1001</ProjectId>
            <ProjectName>Prj1</ProjectName>
            <Activities> <!--Activities in Project1 -->
                <IndActivity>
                    <ActivityId>101</ActivityId>
                    <ActivityName>T1</ActivityName>
                </IndActivity>
                <IndActivity>
                    <ActivityId>103</ActivityId>
                    <ActivityName>T2</ActivityName>
                </IndActivity>
            </Activities>
        </Project>
        <Project>
            <ProjectId>1002</ProjectId>
            <ProjectName>Prj2</ProjectName>
            <Activities>
                <IndActivity>
                    <ActivityId>104</ActivityId>
                    <ActivityName>T4</ActivityName>
                </IndActivity>
            </Activities>
        </Project>
    </ManagerWiseResult>
    <ManagerWiseResult>
        <Project>
            <ProjectId>1001</ProjectId>
            <ProjectName>Prj1</ProjectName>
            <Activities>
                <IndActivity>
                    <ActivityId>102</ActivityId>
                    <ActivityName>T2</ActivityName>
                </IndActivity>
            </Activities>
        </Project>
        <Project>
            <ProjectId>1002</ProjectId>
            <ProjectName>Prj2</ProjectName>
            <Activities>
                <IndActivity>
                    <ActivityId>105</ActivityId>
                    <ActivityName>T5</ActivityName>
                </IndActivity>
            </Activities>
        </Project>
    </ManagerWiseResult>
</Results>

我正在试着找出一个解决方案,但没能。专家们,请您在这方面帮助我。

提前谢谢你,拉维

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-07 03:58:02

这里提出了一种基于的“慕尼黑分组”的解决方案。

试试这个:

代码语言:javascript
复制
<xsl:stylesheet  version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" />

    <xsl:key name="kmanager" match="Result" use="manager" />
    <xsl:key name="kmanager_prj" match="Result" use="concat(manager,'#',ProjectId )" />

    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Result">
        <IndActivity>
            <xsl:apply-templates select="ActivityId" />
            <xsl:apply-templates select="ActivityName" />
        </IndActivity>
    </xsl:template>

    <xsl:template match="Result" mode="project">
        <Project>
            <xsl:copy-of select="ProjectId"/>
            <xsl:copy-of select="ProjectName"/>

            <Activities>
                <xsl:for-each select="key( 'kmanager_prj', concat(manager,'#',ProjectId ))">    
                    <xsl:apply-templates  select="."/>
                </xsl:for-each>
            </Activities>

        </Project>
    </xsl:template>


        <xsl:template match="Result" mode="manager">
        <xsl:apply-templates select="customer | jobType" />
            <ManagerWiseResult>
                <Manager>
                    <xsl:value-of select="manager"/>
                </Manager>
                <xsl:apply-templates mode="project"
            select="//Result[
                generate-id()= 
                generate-id(
                    key( 'kmanager_prj',
                            concat (current()/manager,'#', ProjectId )
                        ) [1])]"  />            
            </ManagerWiseResult>
    </xsl:template>
    <xsl:template match="/*">
        <xsl:copy>
        <xsl:apply-templates  mode="manager"
        select="//Result[
                generate-id()= 
                generate-id(
                    key( 'kmanager',
                            manager 
                        ) [1])]"  />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

它将生成以下输出:

代码语言:javascript
复制
<?xml version="1.0"?>
<Results>
    <ManagerWiseResult>
        <Manager>jcooper</Manager>
        <Project>
            <ProjectId>1001</ProjectId>
            <ProjectName>Prj1</ProjectName>
            <Activities>
                <IndActivity>
                    <ActivityId>101</ActivityId>
                    <ActivityName>T1</ActivityName>
                </IndActivity>
                <IndActivity>
                    <ActivityId>103</ActivityId>
                    <ActivityName>T3</ActivityName>
                </IndActivity>
            </Activities>
        </Project>
        <Project>
            <ProjectId>1002</ProjectId>
            <ProjectName>Prj2</ProjectName>
            <Activities>
                <IndActivity>
                    <ActivityId>104</ActivityId>
                    <ActivityName>T4</ActivityName>
                </IndActivity>
            </Activities>
        </Project>
    </ManagerWiseResult>
    <ManagerWiseResult>
        <Manager>jstein</Manager>
        <Project>
            <ProjectId>1002</ProjectId>
            <ProjectName>Prj2</ProjectName>
            <Activities>
                <IndActivity>
                    <ActivityId>102</ActivityId>
                    <ActivityName>T2</ActivityName>
                </IndActivity>
                <IndActivity>
                    <ActivityId>105</ActivityId>
                    <ActivityName>T5</ActivityName>
                </IndActivity>
            </Activities>
        </Project>
    </ManagerWiseResult>
</Results>

注意:但这与您的陈述不符:

其中,Manager jcooper具有Prj1{that has Activity T1,T3}和prj2{has Activity T4} Manager jstein具有Prj1(具有Activity T2)和Prj2{has Activity T5}

票数 0
EN

Stack Overflow用户

发布于 2013-05-07 05:13:36

这里有一个可能的XSLT 2.0解决方案。

当此XSLT:时为

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:output omit-xml-declaration="yes" indent="yes"/>
   <xsl:strip-space elements="*"/>

   <xsl:key name="kResultByManager" match="Result" use="manager"/>

   <xsl:template match="/*">
     <Results>
       <xsl:for-each-group
         select="*/manager"
         group-by=".">
         <ManagerWiseResult>
           <Manager>
             <xsl:value-of select="."/>
           </Manager>
           <xsl:for-each-group
             select="key('kResultByManager', current-grouping-key())"
             group-by="ProjectId">
             <Project>
               <xsl:copy-of select="ProjectId|ProjectName"/>
                 <Activities>
                   <xsl:for-each select="current-group()">
                     <IndActivity>
                       <xsl:copy-of select="ActivityId|ActivityName"/>
                     </IndActivity>
                   </xsl:for-each>
                 </Activities>
               </Project>
             </xsl:for-each-group>
           </ManagerWiseResult>
         </xsl:for-each-group>
       </Results>
       </xsl:template>
</xsl:stylesheet>

对提供的XML应用...is:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Results>
  <Result>
    <ActivityId>101</ActivityId>
    <ActivityName>T1</ActivityName>
    <ProjectId>1001</ProjectId>
    <ProjectName>Prj1</ProjectName>
    <Description>some desc</Description>
    <manager>jcooper</manager>
  </Result>
  <Result>
    <ActivityId>102</ActivityId>
    <ActivityName>T2</ActivityName>
    <ProjectId>1002</ProjectId>
    <ProjectName>Prj2</ProjectName>
    <Description>some desc</Description>
    <manager>jstein</manager>
  </Result>
  <Result>
    <ActivityId>103</ActivityId>
    <ActivityName>T3</ActivityName>
    <ProjectId>1001</ProjectId>
    <ProjectName>Prj1</ProjectName>
    <Description>some desc</Description>
    <manager>jcooper</manager>
  </Result>
  <Result>
    <ActivityId>104</ActivityId>
    <ActivityName>T4</ActivityName>
    <ProjectId>1002</ProjectId>
    <ProjectName>Prj2</ProjectName>
    <Description>some desc</Description>
    <manager>jcooper</manager>
  </Result>
  <Result>
    <ActivityId>105</ActivityId>
    <ActivityName>T5</ActivityName>
    <ProjectId>1002</ProjectId>
    <ProjectName>Prj2</ProjectName>
    <Description>some desc</Description>
    <manager>jstein</manager>
  </Result>
</Results>

生成...the想要的结果:

代码语言:javascript
复制
<Results>
  <ManagerWiseResult>
    <Manager>jcooper</Manager>
    <Project>
      <ProjectId>1001</ProjectId>
      <ProjectName>Prj1</ProjectName>
      <Activities>
        <IndActivity>
          <ActivityId>101</ActivityId>
          <ActivityName>T1</ActivityName>
        </IndActivity>
        <IndActivity>
          <ActivityId>103</ActivityId>
          <ActivityName>T3</ActivityName>
        </IndActivity>
      </Activities>
    </Project>
    <Project>
      <ProjectId>1002</ProjectId>
      <ProjectName>Prj2</ProjectName>
      <Activities>
        <IndActivity>
          <ActivityId>104</ActivityId>
          <ActivityName>T4</ActivityName>
        </IndActivity>
      </Activities>
    </Project>
  </ManagerWiseResult>
  <ManagerWiseResult>
    <Manager>jstein</Manager>
    <Project>
      <ProjectId>1002</ProjectId>
      <ProjectName>Prj2</ProjectName>
      <Activities>
        <IndActivity>
          <ActivityId>102</ActivityId>
          <ActivityName>T2</ActivityName>
        </IndActivity>
        <IndActivity>
          <ActivityId>105</ActivityId>
          <ActivityName>T5</ActivityName>
        </IndActivity>
      </Activities>
    </Project>
  </ManagerWiseResult>
</Results>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16405357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档