2012-09-04 35 views
1

我輸入的XML就像二維分組和Sumation公司在XSLT

<Reports> 
    <Report> 
    <ReportHeader> 
     <Name>ABC</Name> 
     <ReportNo>123</ReportNo> 
    </ReportHeader> 
    <ReportLine> 
     <ReportNo>123</ReportNo> 
     <LineGroup>XYZ</LineGroup> 
     <LineAmount>10</LineAmount> 
    <ReportLine> 
    <ReportLine> 
     <ReportNo>123</ReportNo> 
     <LineGroup>PQR</LineGroup> 
     <LineAmount>20</LineAmount> 
    <ReportLine> 
    <ReportLine> 
    <ReportNo>123</ReportNo> 
     <LineGroup>XYZ</LineGroup> 
     <LineAmount>30</LineAmount> 
    <ReportLine> 
    </Report> 
    <Report> 
    <ReportHeader> 
     <Name>DEF</Name> 
     <ReportNo>456</ReportNo> 
    </ReportHeader> 
    <ReportLine> 
     <ReportNo>456</ReportNo> 
     <LineGroup>IJK</LineGroup> 
     <LineAmount>40</LineAmount> 
    <ReportLine> 
    <ReportLine> 
     <ReportNo>456</ReportNo> 
     <LineGroup>XYZ</LineGroup> 
     <LineAmount>50</LineAmount> 
    <ReportLine> 
    <ReportLine> 
     <ReportNo>456</ReportNo> 
     <LineGroup>IJK</LineGroup> 
     <LineAmount>60</LineAmount> 
    <ReportLine> 
    </Report> 
</Reports> 

我的輸出XML就像

<NewReport> 
    <Header> 
    <Name>ABC</Name> 
    <HeaderNo>456</HeaderNo> 
    </Header> 
    <Line> 
    <LineGroup>XYZ</LineGroup> 
    <Amount>40</Amount> 
    </Line> 
    <Line> 
    <LineGroup>PQR</LineGroup> 
    <Amount>20</Amount> 
    </Line> 
</NewReport> 
<NewReport> 
    <Header> 
    <Name>DEF</Name> 
    <HeaderNo>456</HeaderNo> 
    </Header> 
    <Line> 
    <LineGroup>IJK</LineGroup> 
    <Amount>100</Amount> 
    </Line> 
    <Line> 
    <LineGroup>XYZ</LineGroup> 
    <Amount>50</Amount> 
    </Line> 
</NewReport> 

我使用的XSL是

<xsl:key name="KLinesByGroup" match="/Reports/Report/ReportLine" use="LineGroup"/> 
<xsl:key name="KLinesByReportNo" match="/Reports/Report/ReportLine" use="ReportNo"/> 
<xsl:template match="/"> 
    <xsl:for-each select="/ns2:Reports/ns2:Report"> 
    <xsl:variable name="HeaderReportNo"><xsl:value-of select="ReportHeader/ReportNo"/></xsl:variable> 
    <Header> 
     <Name><xsl:value-of select="ReportHeader/Name"/></Name> 
     <HeaderNo><xsl:value-of select="ReportHeader/ReportNo"/></HeaderNo> 
     <xsl:apply-templates select="key('KLinesByReportNo', $HeaderReportNo)[1]" mode="reportno-mode"/> 
    </Header> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template match="ReportLine" mode="reportno-mode"> 
    <xsl:apply-templates select="key('KLinesByReportNo', ReportNo)[generate-id() = generate-id(key('KLinesByGroup', LineGroup)[1])]" mode="group-mode"/> 
</xsl:template> 

<xsl:template match="ReportLine" mode="group-mode"> 
    <Line> 
    <xsl:value-of select="sum(key('KLinesByGroup', LineGroup)/LineAmount)"/> 
    </Line> 
</xsl:template> 

但產量不是我所期待的。我得到的輸出是在組級別或行級別添加所有數量,但不是在行和組級別。任何人都可以幫忙。

由於

回答

0

該轉化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kLine" match="ReportLine" 
    use="concat(../ReportHeader/Name, '+', 
       ../ReportHeader/ReportNo, '+', 
       ReportNo, '+', 
       LineGroup 
      )"/> 

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

<xsl:template match= 
    "ReportLine 
     [not(generate-id() 
      = 
      generate-id(key('kLine', 
          concat(../ReportHeader/Name, '+', 
            ../ReportHeader/ReportNo, '+', 
            ReportNo, '+', 
            LineGroup 
           ) 
         ) 
          [1]) 
      ) 
     ]"/> 

    <xsl:template match="LineAmount"> 
    <Amount> 
    <xsl:value-of select= 
    "sum(key('kLine', 
       concat(../../ReportHeader/Name, '+', 
        ../../ReportHeader/ReportNo, '+', 
        ../ReportNo, '+', 
        ../LineGroup 
        ) 
      ) 
       /LineAmount 
     )"/> 
    </Amount> 
    </xsl:template> 

    <xsl:template match="ReportLine/ReportNo"/> 

    <xsl:template match="/*"><xsl:apply-templates/></xsl:template> 
    <xsl:template match="Report"> 
    <NewReport><xsl:apply-templates/></NewReport> 
    </xsl:template> 

    <xsl:template match="ReportHeader"> 
    <Header><xsl:apply-templates/></Header> 
    </xsl:template> 

    <xsl:template match="ReportNo"> 
    <HeaderNo><xsl:apply-templates/></HeaderNo> 
    </xsl:template> 

    <xsl:template match="ReportLine"> 
    <Line><xsl:apply-templates/></Line> 
    </xsl:template> 
</xsl:stylesheet> 

當所提供的XML應用(從幾個格式錯誤代碼校正的)文件:

<Reports> 
    <Report> 
    <ReportHeader> 
     <Name>ABC</Name> 
     <ReportNo>123</ReportNo> 
    </ReportHeader> 
    <ReportLine> 
     <ReportNo>123</ReportNo> 
     <LineGroup>XYZ</LineGroup> 
     <LineAmount>10</LineAmount> 
    </ReportLine> 
    <ReportLine> 
     <ReportNo>123</ReportNo> 
     <LineGroup>PQR</LineGroup> 
     <LineAmount>20</LineAmount> 
    </ReportLine> 
    <ReportLine> 
    <ReportNo>123</ReportNo> 
     <LineGroup>XYZ</LineGroup> 
     <LineAmount>30</LineAmount> 
    </ReportLine> 
    </Report> 
    <Report> 
    <ReportHeader> 
     <Name>DEF</Name> 
     <ReportNo>456</ReportNo> 
    </ReportHeader> 
    <ReportLine> 
     <ReportNo>456</ReportNo> 
     <LineGroup>IJK</LineGroup> 
     <LineAmount>40</LineAmount> 
    </ReportLine> 
    <ReportLine> 
     <ReportNo>456</ReportNo> 
     <LineGroup>XYZ</LineGroup> 
     <LineAmount>50</LineAmount> 
    </ReportLine> 
    <ReportLine> 
     <ReportNo>456</ReportNo> 
     <LineGroup>IJK</LineGroup> 
     <LineAmount>60</LineAmount> 
    </ReportLine> 
    </Report> 
</Reports> 

產生想要的,正確的結果

<NewReport> 
    <Header> 
     <Name>ABC</Name> 
     <HeaderNo>123</HeaderNo> 
    </Header> 
    <Line> 
     <LineGroup>XYZ</LineGroup> 
     <Amount>40</Amount> 
    </Line> 
    <Line> 
     <LineGroup>PQR</LineGroup> 
     <Amount>20</Amount> 
    </Line> 
</NewReport> 
<NewReport> 
    <Header> 
     <Name>DEF</Name> 
     <HeaderNo>456</HeaderNo> 
    </Header> 
    <Line> 
     <LineGroup>IJK</LineGroup> 
     <Amount>100</Amount> 
    </Line> 
    <Line> 
     <LineGroup>XYZ</LineGroup> 
     <Amount>50</Amount> 
    </Line> 
</NewReport> 

說明

正確使用的Muenchian Grouping method複合鍵和的identity rule

+0

完美!!!!我不得不爲這個操作要求稍微微調一下......但是感謝代碼。 – user1619873

+0

@ user1619873,不客氣。 –