使用XSLT将KML转换为另一种格式

时间:2016-02-17 09:11:57

标签: xml xslt kml

我正在尝试将从JAK生成的KML(使用默认的ns3名称空间)转换为没有名称空间元素的KML。提到了XSLT相关的问题并找到了一个XSLT:

   <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns3="http://www.opengis.net/kml/2.2">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="ns3:kml">
     <xsl:copy >
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name(.)}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:attribute name="{local-name(.)}">
      <xsl:value-of select="." />
    </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

我原来的KML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:kml xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:ns3="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
    <ns3:Document>
        <ns3:name>testTrail</ns3:name>
       </ns3:Document>
</ns3:kml>

转型结果:

    <?xml version="1.0" encoding="UTF-8"?>
<ns3:kml xmlns:ns3="http://www.opengis.net/kml/2.2" xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
        <Document>
            <name>testTrail</name>
    </Document>
    </kml>

期望的结果:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
        <Document>
            <name>testTrail</name>
    </Document>
    </kml>

如何确保在kml标记中包含名称空间xmlns? 尝试在XSLT中使用不同的组合。请帮助。现在已经尝试了很久了。

尝试@ zx485建议的xslt,结果xml如下所示:

<?xml version="1.0" encoding="UTF-8"?><ns0:kml xmlns:ns0="http://www.opengis.net/kml/2.2">
    <ns1:Document xmlns:ns1="http://www.opengis.net/kml/2.2">
        <ns2:name xmlns:ns2="http://www.opengis.net/kml/2.2">testTrail</ns2:name>

我不希望ns1 ns2 ..名称空间为标记添加前缀。

1 个答案:

答案 0 :(得分:0)

namespace-uri()添加到XSLT的xsl:element,如下所示:

<xsl:template match="*">
  <xsl:element name="{local-name(.)}" namespace="{namespace-uri()}">
    <xsl:value-of select="." />
    <xsl:apply-templates select="@* | node()" />
  </xsl:element>
</xsl:template>
<xsl:template match="@*">
  <xsl:attribute name="{local-name(.)}">
    <xsl:value-of select="." />
  </xsl:attribute>
</xsl:template>
<xsl:template match="text()">
    <xsl:value-of select="." />
</xsl:template>

这使用当前匹配节点的命名空间并复制text()个节点。

编辑:我刚刚使用了上述代码段。删除了以下模板,一切似乎都按要求工作。

<xsl:template match="ns3:kml">
  <xsl:copy >
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

输出

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
    <Document>
        <name>testTrail</name>
       </Document>
</kml>