【问题标题】:Tricky grouping using xslt 1.0使用 xslt 1.0 的棘手分组
【发布时间】:2012-12-14 23:18:04
【问题描述】:

我需要使用 xslt 1.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>

感谢任何帮助。

【问题讨论】:

    标签: xml xslt xslt-1.0


    【解决方案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,内部使用复合键。

    【讨论】:

    • @Abach,又来了? :) 但是当你打败我时,我通常不会告诉你——所以也许我们是 50/50? :) 谢谢!
    • 好点。 :) 无论如何,我总是喜欢看到专家的回答。
    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2023-03-07
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多