【问题标题】:Remove Duplicate Node of second element using XSLT使用 XSLT 删除第二个元素的重复节点
【发布时间】:2020-08-23 21:51:55
【问题描述】:

我对 xslt 了解不多。我试图从我的输入 xml 中删除一些重复的节点,但这些节点并不完全重复。 PremiseId 值是重复的,但纬度、经度、XCoordinate 和 YCoordinate 值不同。如果我们在 Input xml 中获得这样的数据,那么我们只需要选择具有纬度、经度值的 XML 节点的出现。目前我的 xslt 只拾取第一次出现的重复 PremiseId。

输入 XML :-

<CoordinateCollectionRes
    xmlns="http://www.nexteraenergy.org/RetrieveCoordinateResponseSchema"
    xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<ResponseParameter>
        <PremiseId>42210111</PremiseId>
        <Latitude>-80.81082</Latitude>
        <Longitude>28.58942</Longitude>
        <Xcoordinate>3913026</Xcoordinate>
        <Ycoordinate>-42817728</Ycoordinate>
    </ResponseParameter>
    <ResponseParameter>
        <PremiseId>59087449</PremiseId>
        <Latitude/>
        <Longitude/>
        <Xcoordinate>0.0</Xcoordinate>
        <Ycoordinate>0.0</Ycoordinate>
    </ResponseParameter>
    <ResponseParameter>
        <PremiseId>60476616</PremiseId>
        <Latitude/>
        <Longitude/>
        <Xcoordinate>0.0</Xcoordinate>
        <Ycoordinate>0.0</Ycoordinate>
    </ResponseParameter>
    <ResponseParameter>
        <PremiseId>60476616</PremiseId>
        <Latitude>-87.36536</Latitude>
        <Longitude>30.391645</Longitude>
        <Xcoordinate>1556955</Xcoordinate>
        <Ycoordinate>-41998772</Ycoordinate>
    </ResponseParameter>
</CoordinateCollectionRes>

XSLT :-

<?xml version="1.0" encoding="windows-1252" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:ns1="http://www.nexteraenergy.org/RetrieveCoordinateResponseSchema">
  <xsl:template match="/">
    <CoordinateCollectionRes xmlns="http://www.nexteraenergy.org/RetrieveCoordinateResponseSchema">
    <xsl:for-each-group select="/ns1:CoordinateCollectionRes/ns1:ResponseParameter" group-by="./ns1:PremiseId">
        <xsl:copy-of select=".[./ns1:PremiseId=current-grouping-key()]"/>
    </xsl:for-each-group>
  </CoordinateCollectionRes>
  </xsl:template>
</xsl:stylesheet>

输出 XML:-

<CoordinateCollectionRes    xmlns:ns1="http://www.nexteraenergy.org/RetrieveCoordinateResponseSchema" xmlns="http://www.nexteraenergy.org/RetrieveCoordinateResponseSchema">
<ResponseParameter>
<PremiseId>42210111</PremiseId>
<Latitude>-80.81082</Latitude>
<Longitude>28.58942</Longitude>
<Xcoordinate>3913026</Xcoordinate>
<Ycoordinate>-42817728</Ycoordinate>
</ResponseParameter>
<ResponseParameter>
<PremiseId>59087449</PremiseId>
<Latitude/>
<Longitude/>
<Xcoordinate>0.0</Xcoordinate>
<Ycoordinate>0.0</Ycoordinate>
</ResponseParameter>
<ResponseParameter>
<PremiseId>60476616</PremiseId>
<Latitude/>
<Longitude/>
<Xcoordinate>0.0</Xcoordinate>
<Ycoordinate>0.0</Ycoordinate>
</ResponseParameter>
</CoordinateCollectionRes>

预期输出 XML:-

<CoordinateCollectionRes    xmlns:ns1="http://www.nexteraenergy.org/RetrieveCoordinateResponseSchema" xmlns="http://www.nexteraenergy.org/RetrieveCoordinateResponseSchema">
<ResponseParameter>
<PremiseId>42210111</PremiseId>
<Latitude>-80.81082</Latitude>
<Longitude>28.58942</Longitude>
<Xcoordinate>3913026</Xcoordinate>
<Ycoordinate>-42817728</Ycoordinate>
</ResponseParameter>
<ResponseParameter>
<PremiseId>59087449</PremiseId>
<Latitude/>
<Longitude/>
<Xcoordinate>0.0</Xcoordinate>
<Ycoordinate>0.0</Ycoordinate>
</ResponseParameter>
<ResponseParameter>
        <PremiseId>60476616</PremiseId>
        <Latitude>-87.36536</Latitude>
        <Longitude>30.391645</Longitude>
        <Xcoordinate>1556955</Xcoordinate>
        <Ycoordinate>-41998772</Ycoordinate>
    </ResponseParameter>
</CoordinateCollectionRes>

【问题讨论】:

    标签: xslt xslt-grouping


    【解决方案1】:

    怎么样:

    XSLT 2.0

    <xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.nexteraenergy.org/RetrieveCoordinateResponseSchema"
    xpath-default-namespace="http://www.nexteraenergy.org/RetrieveCoordinateResponseSchema">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
    <xsl:template match="/CoordinateCollectionRes">
        <CoordinateCollectionRes>
            <xsl:for-each-group select="ResponseParameter" group-by="PremiseId">
                <xsl:copy-of select="(current-group()[string(Latitude|Latitutde)], current-group())[1]" copy-namespaces="no"/>
            </xsl:for-each-group>
        </CoordinateCollectionRes>
    </xsl:template>
    
    </xsl:stylesheet>
    

    演示https://xsltfiddle.liberty-development.net/93dFepY

    【讨论】:

    • 当我尝试使用此 xslt 时出现错误“解析输入 XML 时出错:遇到文件过早结束”
    • @ShuvraMaitra 我包含了一个演示链接,您可以在其中看到它与您发布的输入相匹配。您引用的错误似乎是指 XML 输入,而不是 XSLT 样式表。所以你可能使用了不同的输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多