Это легко сделать, когда верно следующее (что я предполагаю, что это так):
- все
<timeline>
с в пределах <competition>
являются уникальными
- только
<fixture>
s сразу после данного <timeline>
принадлежат ему
- нет
<fixture>
без элемента <timeline>
перед ним
Это решение XSLT 1.0:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:key name="kFixture"
match="fixture"
use="generate-id(preceding-sibling::timeline[1])"
/>
<xsl:template match="data">
<xsl:copy>
<xsl:apply-templates select="competition" />
</xsl:copy>
</xsl:template>
<xsl:template match="competition">
<xsl:copy>
<xsl:apply-templates select="timeline" />
</xsl:copy>
</xsl:template>
<xsl:template match="timeline">
<xsl:copy>
<xsl:attribute name="time">
<xsl:value-of select="." />
</xsl:attribute>
<xsl:copy-of select="key('kFixture', generate-id())" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
производит:
<data>
<competition>
<timeline time="10:00">
<fixture>team a v team b</fixture>
<fixture>team c v team d</fixture>
</timeline>
<timeline time="12:00">
<fixture>team e v team f</fixture>
</timeline>
<timeline time="16:00">
<fixture>team g v team h</fixture>
<fixture>team i v team j</fixture>
<fixture>team k v team l</fixture>
</timeline>
</competition>
</data>
Обратите внимание на использование <xsl:key>
для сопоставления всех <fixture>
s, которые принадлежат ("предшествует") данному <timeline>
.
Немного более коротким, но менее очевидным решением будет модифицированное преобразование идентичности:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:key name="kFixture"
match="fixture"
use="generate-id(preceding-sibling::timeline[1])"
/>
<xsl:template match="* | @*">
<xsl:copy>
<xsl:apply-templates select="*[not(self::fixture)] | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="timeline">
<xsl:copy>
<xsl:attribute name="time">
<xsl:value-of select="." />
</xsl:attribute>
<xsl:copy-of select="key('kFixture', generate-id())" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>