2012-12-14 100 views
1

我需要使用xslt 1.0做一點棘手的映射。只需要在datetime元素的日期部分進行分組。但元素包含日期和時間。分組後還需要添加小時。使用xslt 1.0的棘手分組

這裏是輸入:

<Records> 
    <Record> 
     <empid>1</empid> 
     <datetime>10/10/2010 11:11:00 AM</datetime> 
     <hours>5</hours> 
    </Record> 
    <Record>    
     <empid>1</empid> 
     <datetime>10/10/2010 10:11:00 AM</datetime> 
     <hours>5</hours> 
    </Record> 
    <Record> 
     <empid>1</empid>   
     <datetime>10/11/2010 11:11:00 AM</datetime> 
     <hours>5</hours> 
    </Record> 
    <Record> 
     <empid>2</empid> 
     <datetime>10/10/2010 10:11:00 AM</datetime> 
     <hours>2</hours> 
    </Record> 
    <Record> 
     <empid>2</empid> 
     <datetime>10/10/2010 9:11:00 AM</datetime> 
     <hours>5</hours> 
    </Record>  
    </Records> 

預期成果是:

<Records> 
     <Record> 
     <empid>1</empid> 
     <detail>  
     <date>10/10/2010</date> 
     <hours>10</hours> 
     </detail> 
    <detail> 
     <date>10/11/2010</date> 
     <hours>5</hours> 
    </detail> 
    </Record> 
    <Record> 
     <empid>2</empid> 
     <detail> 
      <date>10/10/2010</date> 
      <hours>7</hours> 
     </detail> 
    </Record> 
</Records> 

欣賞的任何幫助。

回答

1

這種轉變

<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="kRecById" match="Record" use="empid"/> 
<xsl:key name="kRecByDateId" match="Record" 
      use="concat(empid,'+',substring-before(datetime, ' '))"/> 

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

<xsl:template match= 
    "Record[generate-id()=generate-id(key('kRecById', empid)[1])]"> 
    <Record> 
    <xsl:apply-templates select="empid"/> 
    <xsl:apply-templates mode="inGroup" select= 
    "key('kRecById', empid) 
       [generate-id() 
       = 
       generate-id(key('kRecByDateId', 
          concat(empid,'+',substring-before(datetime, ' ')))[1])]"/> 
    </Record> 
</xsl:template> 

<xsl:template match="Record" mode="inGroup"> 
    <detail> 
    <date><xsl:value-of select="substring-before(datetime, ' ')"/></date> 
    <hours><xsl:value-of select= 
    "sum(key('kRecByDateId', 
       concat(empid,'+',substring-before(datetime, ' ')) 
      )/hours)"/> 
    </hours> 
    </detail> 
</xsl:template> 
<xsl:template match="Record"/> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<Records> 
    <Record> 
     <empid>1</empid> 
     <datetime>10/10/2010 11:11:00 AM</datetime> 
     <hours>5</hours> 
    </Record> 
    <Record> 
     <empid>1</empid> 
     <datetime>10/10/2010 10:11:00 AM</datetime> 
     <hours>5</hours> 
    </Record> 
    <Record> 
     <empid>1</empid> 
     <datetime>10/11/2010 11:11:00 AM</datetime> 
     <hours>5</hours> 
    </Record> 
    <Record> 
     <empid>2</empid> 
     <datetime>10/10/2010 10:11:00 AM</datetime> 
     <hours>2</hours> 
    </Record> 
    <Record> 
     <empid>2</empid> 
     <datetime>10/10/2010 9:11:00 AM</datetime> 
     <hours>5</hours> 
    </Record> 
</Records> 

產生想要的,正確的結果:

<Records> 
    <Record> 
     <empid>1</empid> 
     <detail> 
     <date>10/10/2010</date> 
     <hours>10</hours> 
     </detail> 
     <detail> 
     <date>10/11/2010</date> 
     <hours>5</hours> 
     </detail> 
    </Record> 
    <Record> 
     <empid>2</empid> 
     <detail> 
     <date>10/10/2010</date> 
     <hours>7</hours> 
     </detail> 
    </Record> 
</Records> 

說明

兩個嵌套的Muenchian grouping s時,內使用複合密鑰。

+0

+1再次擊敗我! – ABach

+0

@ABach,再次? :)但是當你打敗我時,我通常不會告訴你 - 也許我們是50/50? :) 謝謝! –

+0

好點。 :)無論如何,我總是喜歡看專家的答案。 – ABach