【问题标题】:XML transformation with xsl - for each使用 xsl 进行 XML 转换 - 对于每个
【发布时间】:2014-01-19 22:02:59
【问题描述】:

我有一个 xml,我想把它转换成另一个 xml。找了2天,没有找到适合我的案例的好例子; 2 个节点 carsdistances

对于每个 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>

如果有人有任何想法欢迎...非常感谢!

附: :我用这个http://xslttest.appspot.com/ 测试xsl。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    您的模板匹配范围太广,因此会生成太多&lt;distances&gt; 元素,并且还会复制原始距离。

    尝试缩小匹配规则。您还可以使用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>
    

    【讨论】:

    • 我有另一个好奇心:我想计算每个 id_car 的总距离 .... 然后平均距离 :sum(distance)/num ber_of_days ... 第一个输出:'1AudiA4_Quattro317' 觉得你可以帮我这个? :)
    • xpath 有一个 sum() 函数可用于计算距离的总和,还有一个 count() 函数可用于计算天数。 xpath 中的除法是用div 运算符而不是斜线字符编写的。所以要得到你想要的,在样式表的&lt;distances&gt;元素中添加这个:&lt;total&gt;&lt;xsl:value-of select="sum(key('Dist_car', id)/distance)" /&gt;&lt;/total&gt; &lt;average&gt;&lt;xsl:value-of select="sum(key('Dist_car', id)/distance) div count(key('Dist_car', id)/distance)" /&gt;&lt;/average&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2013-02-05
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多