Ваш пример ввода XML недействителен - отсутствует первый тег закрытия team
, а события для второй команды имеют неправильные закрывающие теги. Также желаемый результат немного нечеткий - первое событие не отображает имя команды во время второго события. Как я предполагаю, что название команды не должно отображаться, как это уже в заголовке, после XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="realtime_result">
<table>
<tr>
<th>
<xsl:value-of select="//team[1]/team_name"/>
</th>
<th>time</th>
<th>
<xsl:value-of select="//team[2]/team_name"/>
</th>
</tr>
<xsl:apply-templates select="//events/*">
<xsl:sort select="@time"/>
</xsl:apply-templates>
</table>
</xsl:template>
<xsl:template match="*">
<tr>
<td>
<xsl:if test="
parent::events/preceding-sibling::team_name
[
normalize-space()='real madrid'
]">
<xsl:value-of select="concat(local-name(),' : ', .)"/>
</xsl:if>
</td>
<td><xsl:value-of select="@time"/></td>
<td>
<xsl:if test="
parent::events/preceding-sibling::team_name
[
normalize-space()='Barcelona'
]">
<xsl:value-of select="concat(local-name(),' : ', .)"/>
</xsl:if>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
при применении скорректированной входной XML имеет выводе
<table>
<tr>
<th>real madrid</th>
<th>time</th>
<th>Barcelona</th>
</tr>
<tr>
<td></td>
<td>25</td>
<td>goal : messi</td>
</tr>
<tr>
<td>yellow_card : ronaldo</td>
<td>28</td>
<td></td>
</tr>
<tr>
<td>yellow_card : ronaldo</td>
<td>31</td>
<td></td>
</tr>
<tr>
<td>red_card : benzema</td>
<td>39</td>
<td></td>
</tr>
<tr>
<td></td>
<td>44</td>
<td>red_card : messi</td>
</tr>
<tr>
<td></td>
<td>63</td>
<td>yellow_card : iniesta</td>
</tr>
</table>
События отсортированы по времени используя <xsl:sort select="@time"/>
при применении шаблонов к событиям. Шаблон генерации строк проверяет имя команды, используя
<xsl:if test="parent::events/preceding-sibling::team_name
[
normalize-space()='Barcelona'
]">
Поскольку входной XML не имеет пробелы в team_name
, это также может быть записана в виде
<xsl:if test="parent::events/preceding-sibling::team_name
[
.='Barcelona'
]">
normalize-space()
просто удалить любой ведущие или завершающие пробелы, которые иногда необходимы при проверке равенства.
Значение ячейки события записывается только для команды текущего события, а имя события извлекается с использованием local-name()
.
Для справки: xsl:sort, local-name()normalize-space(), и, как может быть полезной для визуализации осей XPath http://www.xmlplease.com/axis
Как заметка на полях - хотя ваш вопрос был downvoted некоторых членов, потому что, как вы заметили, в комментариях, это не показать все предыдущие усилия, я просто хотел дать вам ответ, поскольку вы уже являетесь членом SO в течение 1 1/2 года, и это ваш первый вопрос. Для предстоящих вопросов было бы неплохо включить то, что вы уже пытались найти решение, или свести вопрос к конкретной проблеме, вместо того, чтобы спрашивать, как получить выход Y для ввода X. Как упоминалось в одном комментарии, вы можете подумать о том, чтобы иметь Посмотрите на https://stackoverflow.com/help/how-to-ask
Что вы попробовали? –
Возможно, вам захочется пройти через эту ссылку [Как спросить] (http://stackoverflow.com/help/how-to-ask) .. –
Где находится "merge" part? Вы имели в виду объединить два (или более) события в одном и том же временном интервале? –