1

xslt1.0を使用して少しトリッキーなマッピングを行う必要があります。要素の日付部分でのみグループ化を行う必要がありますdatetime。ただし、要素には日付と時刻の両方が含まれています。また、グループ化した後、時間を追加する必要があります。

入力は次のとおりです。

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

助けてくれてありがとう。

4

1 に答える 1

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>

説明

2つのネストされたMuenchianグループ、内部は複合キーを使用します。

于 2012-12-14T23:50:46.643 に答える