Xml xslt-合并一些元素并对它们进行排序
我有这个xml代码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>
<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'
]">