Xml xslt-合并一些元素并对它们进行排序

Xml xslt-合并一些元素并对它们进行排序,xml,xslt,Xml,Xslt,我有这个xml代码 <realtime_result> <team> <team_name>real madrid</team_name> <events> <yellow_card time="28">ronaldo</yellow_card> <yellow_card time="31">ronaldo</yellow_card>

我有这个xml代码

<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
巴塞罗那
.
.
请注意,事件已排序(25、28、31、39、44…)

有人能帮我吗?
非常感谢。

您的示例输入XML无效-第一个结束
团队
标记丢失,第二个团队的事件具有错误的结束标记。另外,期望的输出有点不清楚-第一个事件不显示团队名称,而第二个事件显示团队名称。我想团队名称不应该显示,因为它已经在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>
normalize-space()
只会删除任何前导或尾随空格,这在检查相等性时有时是必要的。
事件单元格的值仅为当前事件的团队写入,事件名称通过使用
local-name()
检索

作为参考:、和,可能有助于XPath轴的可视化


作为旁注-虽然你的问题被一些成员否决了,因为正如你在评论中所注意到的,它没有显示任何以前的努力,我只是想给你一个答案,因为你已经成为SO成员1 1/2年了,这是你的第一个问题。对于即将到来的问题,将你已经尝试找到的解决方案包括在内,或者把问题减少到一个特定的问题,而不是问如何在一个评论中提到如何获得输入X.的输出Y,你可以考虑看一下

你可能想通过这个链接……“合并”部分在哪里?你的意思是在同一时间段内合并两个(或更多)事件吗?我会认为“巴塞罗那”是数据。这非常有用
<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:if test="parent::events/preceding-sibling::team_name
                                             [
                                               normalize-space()='Barcelona'
                                             ]">
<xsl:if test="parent::events/preceding-sibling::team_name
                                             [
                                              .='Barcelona'
                                             ]">