2013-05-06 46 views
0

希望你做得很好 我有一种情况,我从那个是平的服务的结果集结构 这个结果集经理,他的项目和活动中的每个项目XSLT - 组2级

我想改造这个扁平结构,以XML是

Grouped by Manager 
    Grouped by Project 
     Activities in that Project 

这里是XML,我有

<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> 

在这个什么, 经理jcooper具有Prj1 {已经活动T1,T3},并Prj2 {已经活动T4} 经理jstein具有Prj1(具有活性T2)和prj2 {已经活动T5}

这里是我想要的格式为

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> 

我想弄清楚一个解决方案,但不能。 专家,请你在这方面帮助我。

由于事先 拉维

+0

您仅限于使用XSLT 1.0吗?或者你可以使用2.0的设施吗? – Borodin 2013-05-06 19:19:22

+0

我可以使用XSLT 2.0。 你介意看看我的评论,并帮助我与2.0语法。在此先谢谢 – user2350784 2013-05-06 20:13:01

回答

0

这里的解决方案基于“Muenchian分组的”

试试这个:

<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> 

将产生这样的输出:

<?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> 

注意:但是,这并不符合你的说法:

在此,经理jcooper有Prj1 {具有活动T1,T3}和Prj2 {具有活动T4}管理者jstein具有Prj1(具有活动T2)并且prj2 {具有活动T5}

+0

这真棒!非常感谢。 – user2350784 2013-05-06 20:06:51

+0

很高兴我能帮到你。如果这是您正在寻找的内容,请将答案标为有效。 – 2013-05-06 20:10:59

+0

嗨 这太棒了!像魅力一样工作,非常感谢。 你介意用XSLT 2帮助我吗?0语法,我已经完成了这个,但是这只给出了一部分结果,prj明智的seggregation没有为我发愁。我想在这里粘贴我的XSL,但它不允许我这样做,因为我可以回答我的问题。只有8小时后,评论部分太少了。我将一个接一个地粘贴我的XSLT。 – user2350784 2013-05-06 20:13:48

0

下面是一个可能的XSLT 2.0解决方案。

当这个XSLT:

<?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> 

......想要的结果产生:

<?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应用

<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

非常感谢,它的工作 如何标记特定答案为正确的? – user2350784 2013-05-07 04:05:43

+0

您只需点击答案左上角的复选标记即可。 – ABach 2013-05-07 04:12:18