我正在尝试将从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 ..名称空间为标记添加前缀。
答案 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>