简体   繁体   English

使用xslt 1.0进行棘手的分组

[英]Tricky grouping using xslt 1.0

I need to do a bit tricky mapping using xslt 1.0. 我需要使用xslt 1.0做一些棘手的映射。 need to do grouping only on the date part of the datetime element. 只需要对datetime元素的日期部分进行分组。 However the element contains the both date and time.Also after grouping need to add the hours. 但是元素同时包含日期和时间。分组后还需要添加小时数。

Here is the input: 这是输入:

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

Expected output is: 预期输出为:

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

Appreciate for any help. 感谢任何帮助。

This transformation : 此转换

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

when applied on the provided XML document: 当应用于提供的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>

produces the wanted, correct result: 产生想要的正确结果:

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

Explanation : 说明

Two nested Muenchian grouping s, the inner using a composite key. 两个嵌套的Muenchian分组 s,内部使用组合键。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM