我有一个xml,我想把它转换成另一个xml。寻找2天,并没有找到我的案例的任何好例子; 2个节点汽车和距离。
对于每个id_car,我必须对距离进行分组(参见下面的输出xml)。
来源:
<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
<cars>
<car>
<id>1</id>
<brand>Audi</brand>
<type>A4_Quattro</type>
<license>TEST</license>
</car>
<car>
<id>2</id>
<brand>FORD</brand>
<type>XLT_Ranger</type>
<license>PROTOTYPE</license>
</car>
</cars>
<distances>
<distance>
<id_car>1</id_car>
<date>20110901</date>
<distance>123</distance>
</distance>
<distance>
<id_car>1</id_car>
<date>20110902</date>
<distance>194</distance>
</distance>
<distance>
<id_car>2</id_car>
<date>20110907</date>
<distance>24</distance>
</distance>
<distance>
<id_car>2</id_car>
<date>20110915</date>
<distance>105</distance>
</distance>
</distances>
</output>
输出xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
<cars>
<car>
<id>1</id>
<brand>Audi</brand>
<type>A4_Quattro</type>
<distances>
<distance day="20110901">123</distance>
<distance day="20110902">194</distance>
</distances>
</car>
<car>
<id>2</id>
<brand>FORD</brand>
<type>XLT_Ranger</type>
<license>PROTOTYPE</license>
<distances>
<distance day="20110907">24</distance>
<distance day="20110915">105</distance>
</distances>
</car>
</cars>
<output>
这是几十次尝试的结果:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="Dist_car" match="distances/distance" use="id_car" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<distances>
<xsl:apply-templates select="key('Dist_car', id)"/>
</distances>
</xsl:copy>
</xsl:template>
<xsl:template match="distance">
<distance day="{date}"><xsl:value-of select="distance"/></distance>
</xsl:template>
</xsl:stylesheet>
如果有人有任何想法,欢迎...非常感谢!
P.S。 :我用这个http://xslttest.appspot.com/测试xsl。
答案 0 :(得分:4)
您的模板匹配范围太广,因此会生成太多<distances>
元素,并且还会复制原始距离。
尝试缩小匹配规则。您还可以使用xsl:copy-of
复制源文档的各个部分。
如果我将样式表更改为:
,我会得到您想要的输出<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="Dist_car" match="distances/distance" use="id_car" />
<xsl:template match="/">
<output>
<cars>
<xsl:apply-templates select="output/cars" />
</cars>
</output>
</xsl:template>
<xsl:template match="car">
<xsl:copy>
<xsl:copy-of select="@*|node()" />
<distances>
<xsl:apply-templates select="key('Dist_car', id)" />
</distances>
</xsl:copy>
</xsl:template>
<xsl:template match="distance">
<distance day="{date}">
<xsl:value-of select="distance" />
</distance>
</xsl:template>
</xsl:stylesheet>