我有一个包含事件列表的XML文件。事实上,每个事件都是一段时间的end
和<Events>
<Event id="1" type="begin" date="xxxx"/>
<Event id="2" type="end" date="xxxy"/>
<Event id="3" type="begin" date="xxyx"/>
<Event id="4" type="end" date="xyxx"/>
<Event id="5" type="begin" date="yxxx"/>
<Event id="6" type="end" date="xxyy"/>
</Events>
事件。假设以下XML:
<Events>
<xsl:apply-templates select="//Event"/>
</Events>
<xsl:template match="Event">
<Period>
<Begin>
<Event>
<xsl:attribute name="id" select="[@type='begin']/@id"/>
<xsl:attribute name="date" select="[@type='begin']/@date"/>
</Event>
</Begin>
<End>
<Event>
<xsl:attribute name="id" select="[@type='end']/@id"/>
<xsl:attribute name="date" select="[@type='end']/@date"/>
</Event>
</End>
</Period>
</xsl:template>
我想申请的是这样的:
<Events>
<Period>
<Begin>
<Event id="1" type="begin" date="xxxx"/>
</Begin>
<End>
<Event id="2" type="end" date="xxxy"/>
</End>
</Period>
<Period>
<Begin>
<Event id="3" type="begin" date="xxyx"/>
</Begin>
<End>
<Event id="4" type="end" date="xyxx"/>
</End>
</Period>
<Period>
<Begin>
<Event id="5" type="begin" date="yxxx"/>
</Begin>
<End>
<Event id="6" type="end" date="xxyy"/>
</End>
</Period>
</Events>
预期的结果将是:
<Events>
<Period>
<Begin>
<Event id="1" type="begin" date="xxxx"/>
</Begin>
<End>
<Event id="" type="end" date=""/>
</End>
</Period>
<Period>
<Begin>
<Event id="" type="begin" date=""/>
</Begin>
<End>
<Event id="2" type="end" date="xxxy"/>
</End>
</Period>
...
</Events>
但结果是这一个:
<person-detail person="vm.selectedPerson"></person-detail>
我理解为什么我得到这个结果,因为模板一个接一个地按元素匹配元素,但我想知道是否有办法通过使用模板匹配来实现我的目标&#34;两个节点在同一时间&#34; ?我已经查看了SO,但我发现的唯一一个接近我想要的解决方案的是Muenchian分组(对于像上面这样的小数据集来说,设置起来真的很复杂。)
答案 0 :(得分:2)
嗯,这样的事情应该可以胜任 - 我假设<Event type="begin">
总是紧跟其对应的<Event type="end">
。
<xsl:template match="Event[@type='begin']">
<Period>
<Begin>
<xsl:copy-of select="."/>
</Begin>
<End>
<xsl:copy-of select="following-sibling::Event[1]"/>
</End>
</Period>
</xsl:template>