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>

感谢是否有人可以帮助我。

4

1 回答 1

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>
于 2013-01-21T19:25:29.213 回答