希望你做得很好,我有一个场景,我从一个扁平结构的服务中得到一个结果集这个结果集有经理,他的项目和每个项目中的活动
我想要将这种平面结构转换成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>其中,Manager jcooper具有Prj1{that has Activity T1,T3}和prj2{has Activity T4} Manager jstein具有Prj1(具有Activity T2)和Prj2{has Activity 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>我正在试着找出一个解决方案,但没能。专家们,请您在这方面帮助我。
提前谢谢你,拉维
发布于 2013-05-07 03:58:02
这里提出了一种基于的“慕尼黑分组”的解决方案。
试试这个:
<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>注意:但这与您的陈述不符:
其中,Manager jcooper具有Prj1{that has Activity T1,T3}和prj2{has Activity T4} Manager jstein具有Prj1(具有Activity T2)和Prj2{has Activity T5}
发布于 2013-05-07 05:13:36
这里有一个可能的XSLT 2.0解决方案。
当此XSLT:时为
<?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:
<?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想要的结果:
<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>https://stackoverflow.com/questions/16405357
复制相似问题