2014-12-06 4 views
-4

У меня есть этот XML-кодXSLT - объединить некоторые элементы и отсортировать их

<realtime_result> 
    <team> 
    <team_name>real madrid</team_name> 
    <events> 
     <yellow_card time="28">ronaldo</yellow_card> 
     <yellow_card time="31">ronaldo</yellow_card> 
     <red_card time="39">benzema</red_card> 
      . 
      . 
    </events> 
    </team> 
    <team> 
    <team_name>Barcelona</team_name> 
    <events> 
     <goal time="25">messi</goal> 
     <red_card time="44">messi</red_card> 
     <yellow_card time="63">iniesta</yellow_card> 
      . 
      . 
    </events> 
    </team> 
</realtime_result> 

и мне нужен код XSLT, чтобы преобразовать его в таблицу, как это:

<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>yello card : ronaldo</td> 
    <td>28</td> 
    <td>barcelona</td> 
    </tr> 
    . 
    . 
<table> 

Обратите внимание, что события сортируются (25, 28, 31, 39, 44 ...).

Может ли кто-нибудь мне помочь? Большое спасибо.

+1

Что вы попробовали? –

+1

Возможно, вам захочется пройти через эту ссылку [Как спросить] (http://stackoverflow.com/help/how-to-ask) .. –

+0

Где находится "merge" part? Вы имели в виду объединить два (или более) события в одном и том же временном интервале? –

ответ

1

Ваш пример ввода 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

+0

Я бы подумал, что «Барселона» - это ** данные **. –

+0

резервуары много очень полезно – pooria

+0

и извините за непонятный вопрос Я должен прочитать 'how-to-ask' – pooria

Смежные вопросы