2013-04-04 59 views
0

我有一個相當複雜的XML結構,但在一小段中,我在下面的結構中列出了輸入/輸出時間以及它可能包含的潛在數據:如何根據您在層次結構中的位置找到XML元素

<EventSummary> 
    <Name>In/Out times</Name> 
    <Entries> 
     <Entry> 
     <Name>In</Name> 
     <Time>4/1/2013 10:45</Time> 
     <Value>1</Value> 
     </Entry> 
     <Entry> 
     <Name>In</Name> 
     <Time>4/1/2013 10:55</Time> 
     <Value>1</Value> 
     </Entry> 
     <Entry> 
     <Name>Out</Name> 
     <Time>4/1/2013 11:30</Time> 
     <Value>0</Value> 
     </Entry> 
     <Entry> 
     <Name>In</Name> 
     <Time>4/1/2013 11:35</Time> 
     <Value>1</Value> 
     </Entry> 
    </Entries> 
</EventSummary> 

因此,條目保證按時間順序排列,但我需要協調一個時間與下一個時間。因此,在上面的示例中,我們有一個時間,其次是另一個時間,然後是時間。我需要的最終產品的樣子,在這種情況下是這樣的:

<Table> 
    <Row> 
    <Cell> 
     <Text>4/1/2013 10:45</Text> 
    </Cell> 
    <Cell> 
     <Text>4/1/2013 11:30</Text> 
    </Cell> 
    </Row> 
    <Row> 
    <Cell> 
     <Text>4/1/2013 11:35</Text> 
    </Cell> 
    </Row> 
</Table> 

基本上我需要輸入/輸出對每個一行。所以我需要找到第一個In,然後跳過所有下一個Ins,直到第一個Out,然後如果在Out之後找到另一個In,則開始新行......等等。

我只是無法弄清楚如何在循環查找入口時查找入口或出口。有任何想法嗎?

回答

1

這應做到:

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

    <xsl:template match="/"> 
    <Table> 
     <xsl:apply-templates 
     select="EventSummary/Entries 
        /Entry[Name = 'In' and 
          (not(preceding-sibling::Entry) or 
          preceding-sibling::Entry[1]/Name = 'Out')]" /> 
    </Table> 
    </xsl:template> 

    <xsl:template match="Entry[Name = 'In']"> 
    <Row> 
     <xsl:apply-templates 
     select="Time | 
       following-sibling::Entry[Name = 'Out'][1]/Time" /> 
    </Row> 
    </xsl:template> 

    <xsl:template match="Time"> 
    <Cell> 
     <Text> 
     <xsl:value-of select="." /> 
     </Text> 
    </Cell> 
    </xsl:template> 
</xsl:stylesheet> 

當你的樣品輸入運行,其結果是:

<Table> 
    <Row> 
    <Cell> 
     <Text>4/1/2013 10:45</Text> 
    </Cell> 
    <Cell> 
     <Text>4/1/2013 11:30</Text> 
    </Cell> 
    </Row> 
    <Row> 
    <Cell> 
     <Text>4/1/2013 11:35</Text> 
    </Cell> 
    </Row> 
</Table> 
相關問題