空白记录之后的节点总和,直到使用xslt 1.0的下一个空白记录

时间:2013-01-21 18:59:23

标签: xslt xslt-1.0

我正在一个项目中工作,我需要计算空白时间之后的小时数,直到下一个空白时间,并在输出中显示它们。

这是输入:

   <Nodes>
       <Node>
         <EmpId>1<EmpId>      
         <InTime></InTime>
         <Hours></Hours>
        </Node>
      <Node>
        <EmpId>1<EmpId>          
        <InTime>10/12/2010</InTime>
         <Hours>5</Hours>
      </Node>
      <Node>
        <EmpId>1<EmpId>
         <InTime>10/13/2010</InTime>
         <Hours>5</Hours>
      </Node>
      <Node>
        <EmpId>1<EmpId>
        <InTime></InTime>
         <Hours></Hours>
      </Node>
      <Node>
        <EmpId>1</EmpId>
        <InTime></InTime>
        <Hours></Hours>
      </Node>
      <Node>
         <EmpId>1</EmpId>
         <InTime>10/14/2010</InTime>
          <Hours>2</Hours>
      </Node>
      <Node>
        <EmpId>1</EmpId>
        <InTime>10/14/2010</InTime>
        <Hours>3</Hours>
      </Node>
   </Nodes>

输出应该是:

<Nodes>
      <Detail>
         <EmpId>1</EmpId>
          <InTime>10/12/2010</InTime>
           <Hours>10</Hours>
      </Detail>
      <Detail>
        <EmpId>1</EmpId>
        <InTime>10/14/2010</InTime>
         <Hours>5</Hours>
      </Detail>
   </Nodes>

感谢任何人可以帮助我。

1 个答案:

答案 0 :(得分:0)

您的输入XML格式不正确(多个<EmpId>标记应该有</EmpId>),但一旦修复,我相信这就是您所描述的内容:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/Nodes">
    <Nodes>
       <xsl:apply-templates select="Node[Hours != '' and not(normalize-space(preceding-sibling::Node[1]/Hours))]" />
    </Nodes>
  </xsl:template>

  <xsl:template match="Node">
    <Detail>
      <xsl:copy-of select="EmpId | InTime"/>
      <Hours>
        <xsl:apply-templates select="." mode="SumHours" />
      </Hours>
    </Detail>
  </xsl:template>

  <xsl:template match="Node[normalize-space(following-sibling::Node[1]/Hours)]" mode="SumHours">
    <xsl:param name="total" select="0" />
    <xsl:apply-templates select="following-sibling::Node[1]" mode="SumHours">
      <xsl:with-param name="total" select="$total + Hours" />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="Node" mode="SumHours">
    <xsl:param name="total" select="0" />
    <xsl:value-of select="$total + Hours"/>
  </xsl:template>

</xsl:stylesheet>