Удалите повторяющийся узел второго элемента с помощью XSLT - PullRequest
1 голос
/ 08 мая 2020

Я не очень разбираюсь в 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>

1 Ответ

1 голос
/ 08 мая 2020

Как насчет:

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

...