0

我有一个相当复杂的 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>

所以这些条目保证是按时间顺序排列的,但我需要协调一个 In 时间和下一个 Out 时间。因此,在上面的示例中,请注意我们有一个 In 时间,然后是另一个 In tim,然后是 Out 时间,然后是 In 时间。我需要最终产品的样子,在这种情况下是这样的:

<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,然后跳过所有下一个 In,直到第一个 Out,然后如果在 Out 之后找到另一个 In,则开始一个新行......等等。

我只是不知道如何在循环访问条目时从寻找 In 或 Out 切换。有任何想法吗?

4

1 回答 1

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>
于 2013-04-04T16:22:03.100 回答