0

うまくいっていることを願っています フラット構造のサービスから結果セットを取得するシナリオがあります この結果セットには、マネージャー、彼のプロジェクト、および各プロジェクトのアクティビティが含まれます

このフラットな構造を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>

私は解決策を見つけようとしていますが、できませんでした。専門家の皆様、この件に関して私を助けていただけませんか。

前もってありがとう、ラヴィ

4

2 に答える 2

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 がある} があります。

于 2013-05-06T19:58:01.893 に答える