将所有标记作为字符串连接到一个标记中

时间:2016-10-18 11:50:04

标签: xml xslt

我需要转换XML并遇到一些问题......

当前XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dat="http://ws.wso2.org/dataservice">
<soapenv:Body>
    <dat:UpsertItemGeoObject>
        <dat:ItemId>?</dat:ItemId>
        <dat:GeoObjects>
            <dat:GeoObjectPoint>
                <dat:GeoObjectType>Point</dat:GeoObjectType>
                <dat:GeoObjectPoints>
                    <dat:Point>
                        <dat:Lat>1.123</dat:Lat>
                        <dat:Lng>1.123</dat:Lng>
                    </dat:Point>
                </dat:GeoObjectPoints>
            </dat:GeoObjectPoint>
            <dat:GeoObjectPolyline>
                <dat:GeoObjectType>Polyline</dat:GeoObjectType>
                <dat:GeoObjectPoints>
                    <!--one or more repetitions:-->
                    <dat:Point>
                        <dat:Lat>2.123</dat:Lat>
                        <dat:Lng>2.456</dat:Lng>
                    </dat:Point>
                    <dat:Point>
                        <dat:Lat>2.123</dat:Lat>
                        <dat:Lng>2.789</dat:Lng>
                    </dat:Point>
                    <dat:Point>
                        <dat:Lat>2.123</dat:Lat>
                        <dat:Lng>2.000</dat:Lng>
                    </dat:Point>
                </dat:GeoObjectPoints>
            </dat:GeoObjectPolyline>
            <dat:GeoObjectPolygon>
                <dat:GeoObjectType>Polygon</dat:GeoObjectType>
                <dat:GeoObjectPoints>
                    <!--one or more repetitions:-->
                    <dat:Point>
                        <dat:Lat>3.123</dat:Lat>
                        <dat:Lng>3.123</dat:Lng>
                    </dat:Point>
                    <dat:Point>
                        <dat:Lat>3.123</dat:Lat>
                        <dat:Lng>3.123</dat:Lng>
                    </dat:Point>
                    <dat:Point>
                        <dat:Lat>3.123</dat:Lat>
                        <dat:Lng>3.123</dat:Lng>
                    </dat:Point>
                    <dat:Point>
                        <dat:Lat>3.123</dat:Lat>
                        <dat:Lng>3.123</dat:Lng>
                    </dat:Point>
                    <dat:Point>
                        <dat:Lat>3.123</dat:Lat>
                        <dat:Lng>3.123</dat:Lng>
                    </dat:Point>
                </dat:GeoObjectPoints>
            </dat:GeoObjectPolygon>
        </dat:GeoObjects>
    </dat:UpsertItemGeoObject>
</soapenv:Body>

期望的输出:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dat="http://ws.wso2.org/dataservice">
<soapenv:Body>
    <dat:UpsertItemGeoObject>
        <dat:ItemId>12345</dat:ItemId>
        <dat:GeoObjects>
            <dat:GeoObjectPoint>
                <dat:GeoObjectType>Point</dat:GeoObjectType>
                <dat:Coordinates>1.123 1.123</dat:Coordinates>
            </dat:GeoObjectPoint>
            <dat:GeoObjectPolyline>
                <dat:GeoObjectType>Polyline</dat:GeoObjectType>
                <dat:Coordinates>2.123 2.456,2.123 2.789,2.123 2.000</dat:Coordinates><!-- Lat Long, Lat Long, Lat Long -->
            </dat:GeoObjectPolyline>
            <dat:GeoObjectPolygon>
                <dat:GeoObjectType>Polygon</dat:GeoObjectType>
                <dat:Coordinates>3.123 3.123,3.123 3.123,3.123 3.123</dat:Coordinates><!-- Lat Long, Lat Long, Lat Long -->
            </dat:GeoObjectPolygon>
        </dat:GeoObjects>
    </dat:UpsertItemGeoObject>
</soapenv:Body>

我想连接

中的所有坐标
                        <dat:Point>
                          <dat:Lat>1.123</dat:Lat>
                          <dat:Lng>1.123</dat:Lng>
                        </dat:Point>

加入一个标记 - <Coordinates>Lat(Space)Lng(Coma)Lat(Space)Lng<Coordinates>,但我无法帮助我完成此任务。 如果有人可以提供某种形式的例子或其他类似的东西,我会非常感激。

1 个答案:

答案 0 :(得分:0)

以这种方式尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dat="http://ws.wso2.org/dataservice">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="dat:GeoObjectPoints">
    <dat:Coordinates>
        <xsl:for-each select="dat:Point">
            <xsl:value-of select="dat:Lat"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="dat:Lng"/>
            <xsl:if test="position()!=last()">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:for-each>
    </dat:Coordinates>
</xsl:template>

</xsl:stylesheet>