XSLT删除重复节点&amp;额外的<row>

时间:2015-05-05 19:42:38

标签: xml xslt

我很难写一个XSLT去除额外的roes和重复的节点。所以需要你的帮助。

我的XML如下所示:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Rowsets CachedTime="" DateCreated="2015-05-05T19:27:06" EndDate="2015-05-05T19:27:06" StartDate="2015-05-05T18:27:06" Version="14.0.0 Build(802)">
    <Rowset>
        <Columns>
            <Column Description="DateTime" MaxRange="0" MinRange="0" Name="DateTime" SQLDataType="93" SourceColumn="DateTime"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LI132.PV" SQLDataType="6" SourceColumn="10LI132.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LQ132.PV" SQLDataType="6" SourceColumn="10LQ132.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10TI112.PV" SQLDataType="6" SourceColumn="10TI112.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LI135.PV" SQLDataType="6" SourceColumn="10LI135.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LQ132.PV" SQLDataType="6" SourceColumn="10LQ132.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LI127.PV" SQLDataType="6" SourceColumn="10LI127.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10TI112.PV" SQLDataType="6" SourceColumn="10TI112.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LQ127.PV" SQLDataType="6" SourceColumn="10LQ127.PV"/>
        </Columns>
        <Row>
            <DateTime>2015-05-05T18:27:06</DateTime>
            <A>55465.359375</A>
            <B>1808040</B>
            <C>-331.424926757812</C>
            <D>-74553.75</D>
            <B>1808040</B>
            <F>-10100.994140625</F>
            <C>-331.424926757812</C>
            <G>-445363.5625</G>
        </Row>
        <Row>
            <DateTime>2015-05-05T18:27:06</DateTime>
            <A>NA</A>
            <B>NA</B>
            <C>NA</C>
            <D>NA</D>
            <B>1808040</B>
            <F>NA</F>
            <C>NA</C>
            <G>NA</G>
        </Row>
        <Row>
            <DateTime>2015-05-05T18:27:06</DateTime>
            <A>NA</A>
            <B>NA</B>
            <C>NA</C>
            <D>NA</D>
            <B>NA</B>
            <F>NA</F>
            <C>-331.424926757812</C>
            <G>NA</G>
        </Row>
    </Rowset>
</Rowsets>

我希望我的结果XML如下:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Rowsets CachedTime="" DateCreated="2015-05-05T19:27:06" EndDate="2015-05-05T19:27:06" StartDate="2015-05-05T18:27:06" Version="14.0.0 Build(802)">
    <Rowset>
        <Columns>
            <Column Description="DateTime" MaxRange="0" MinRange="0" Name="DateTime" SQLDataType="93" SourceColumn="DateTime"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LI132.PV" SQLDataType="6" SourceColumn="10LI132.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LQ132.PV" SQLDataType="6" SourceColumn="10LQ132.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10TI112.PV" SQLDataType="6" SourceColumn="10TI112.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LI135.PV" SQLDataType="6" SourceColumn="10LI135.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LQ132.PV" SQLDataType="6" SourceColumn="10LQ132.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LI127.PV" SQLDataType="6" SourceColumn="10LI127.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10TI112.PV" SQLDataType="6" SourceColumn="10TI112.PV"/>
            <Column Description="" MaxRange="0" MinRange="0" Name="_10LQ127.PV" SQLDataType="6" SourceColumn="10LQ127.PV"/>
        </Columns>
        <Row>
            <DateTime>2015-05-05T18:27:06</DateTime>
            <A>55465.359375</A>
            <B>1808040</B>
            <C>-331.424926757812</C>
            <D>-74553.75</D>
            <F>-10100.994140625</F>
            <G>-445363.5625</G>
        </Row>
    </Rowset>
</Rowsets>

请注意,节点,ets是动态生成的,因此无法在XSLT中对其进行硬编码。

如果您有任何想法可以解决我的问题,请告诉我。

提前致谢。

2 个答案:

答案 0 :(得分:2)

此问题的一个简单解决方案是查看前面有Row的{​​{1}},并查看前面有一个名称相同的元素。有了这些 - 什么都不做:

Row

所有其他元素都按原样复制。

答案 1 :(得分:1)

你使用xslt 2.0吗?如果是这样,请参阅下面的样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:strip-space elements="*"/>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Rowset/Row[1]">
        <xsl:copy>
            <xsl:for-each-group select="*" group-by=".">
                <xsl:copy-of select="current-group( )[1]"/>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="//Row[preceding-sibling::Row]"/>

</xsl:stylesheet>