我有一个问题,我无法找出用于将xml“转换”为另一个xml的XSL代码
这是输入xml:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<output>
<cars>
<car>
<id>1</id>
<brand>Audi</brand>
<type>A3</type>
<license>B-01-TST</license>
</car>
<car>
<id>2</id>
<brand>Volkwagen</brand>
<type>Golf</type>
<license>IF-02-TST</license>
</car>
</cars>
<distances>
<distance>
<id_car>1</id_car>
<date>20110901</date>
<distance>111</distance>
</distance>
<distance>
<id_car>1</id_car>
<date>20110902</date>
<distance>23</distance>
</distance>
<distance>
<id_car>1</id_car>
<date>20110903</date>
<distance>0</distance>
</distance>
<distance>
<id_car>2</id_car>
<date>20110901</date>
<distance>92</distance>
</distance>
<distance>
<id_car>2</id_car>
<date>20110902</date>
<distance>87</distance>
</distance>
<distance>
<id_car>2</id_car>
<date>20110903</date>
<distance>132</distance>
</distance>
</distances>
</output>
这是输出xml:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<cars>
<car>
<id>1</id>
<brand>Audi</brand>
<type>A3</type>
<license>B-01-TST</license>
<distances>
<distance day="20110901">111</distance>
<distance day="20110902">23</distance>
<distance day="20110903">0</distance>
</distances>
</car>
<car>
<id>2</id>
<brand>Volkwagen</brand>
<type>Golf</type>
<license>IF-02-TST</license>
<distances>
<distance day="20110901">92</distance>
<distance day="20110902">87</distance>
<distance day="20110903">132</distance>
</distances>
</car>
</cars>
结束时元素车的结束我忘记了。
谢谢。
答案 0 :(得分:2)
使用XSLT实际上很容易做到这一点;最难的部分是使用钥匙。这是您需要的代码:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="distances" match="distance" use="id_car" />
<xsl:template match="output">
<xsl:apply-templates select="cars" />
</xsl:template>
<xsl:template match="car">
<xsl:copy>
<xsl:apply-templates />
<distances>
<xsl:apply-templates select="key('distances', id)" />
</distances>
</xsl:copy>
</xsl:template>
<xsl:template match="distance">
<distance day="{date}">
<xsl:value-of select="distance" />
</distance>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
该密钥实质上允许您使用key
函数获取具有给定值distance
的所有id_car
元素的列表。
第一个模板处理根并仅输出cars
元素。
第二个模板处理所有car
元素,完全按原样输出它们,但添加distances
元素,并使用key
函数处理任何distance
元素1}}具有正确ID的元素。
最后一个模板是'身份'模板,它复制我们尚未完全按照原因计算的任何元素;这会处理brand
,type
,license
元素,依此类推。