2013-01-21 34 views
0

我正在一個項目中工作,我需要計算空白小時後的小時數,直到下一個空白小時爲止,並將它們顯示爲輸出中的數據。使用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> 

欣賞,如果任何一個可以幫助我在此。

回答

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>