【发布时间】:2014-05-20 15:29:04
【问题描述】:
我得到的 KML 文件的描述标签有一个空的命名空间声明。它们如下:
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Placemark>
<Point>
<coordinates>10.42195,46.9603,0</coordinates>
</Point>
<Name>Hallo world</Name>
<description xmlns="">My description
</description>
</Placemark>
...
</Document>
</kml>
我写了一个 XSLT 转换如下:
<xsl:template match="kml:Placemark">
...
<xsl:apply-templates select="description" />
</xsl:template>
<xsl:template match="description">
<xsl:element name="payload">
<xsl:value-of select="." />
</xsl:element>
</xsl:template>
description 节点未被选中。如果我删除(空)命名空间声明,它将被选中。我已经在 SO 上看到过类似的问题,并且我已经尝试了建议的解决方案,但不幸的是它们都不能解决我的问题。
如何选择包含空命名空间声明 xmlns="" 的 description 节点?
谢谢!
编辑:我包括完整的样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:xdt="http://www.w3.org/2005/xpath-datatypes"
xmlns:xalan="http://xml.apache.org/xslt"
xmlns:err="http://www.w3.org/2005/xqt-errors"
xmlns:exsl="http://exslt.org/common"
xmlns:str="http://exslt.org/strings"
xmlns:kml="http://www.opengis.net/kml/2.2"
extension-element-prefixes="str">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4" />
<xsl:strip-space elements="*" />
<xsl:param name="myExpirationDate" />
<xsl:param name="myTime" />
<xsl:template match="/">
<xsl:element name="drive_ahead_message">
<xsl:element name="header">
<xsl:element name="version">1.0</xsl:element>
</xsl:element>
<xsl:element name="messages">
<xsl:apply-templates select="kml:kml/kml:Document/kml:Placemark" />
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="kml:Placemark">
<xsl:element name="message">
<xsl:element name="message_id">
<xsl:value-of select="count(preceding-sibling::kml:Placemark) + 1" />
</xsl:element>
<xsl:element name="timestamp">
<xsl:value-of select="$myTime" />
</xsl:element>
<xsl:element name="expiration_date">
<xsl:value-of select="$myExpirationDate " />
</xsl:element>
<xsl:apply-templates select="kml:Name" />
<xsl:apply-templates select="kml:Point" />
<xsl:apply-templates select="kml:description" />
</xsl:element>
</xsl:template>
<xsl:template match="kml:description">
<xsl:element name="payload">
<xsl:value-of select="." />
</xsl:element>
</xsl:template>
<xsl:template match="kml:Name">
<xsl:element name="cause">
<xsl:element name="lang">en</xsl:element>
<xsl:element name="causename">
<xsl:value-of select="." />
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="kml:Point">
<xsl:variable name="coords">
<xsl:value-of select="./kml:coordinates" />
</xsl:variable>
<xsl:variable name="longitude">
<xsl:value-of select="substring-before($coords,',')" />
</xsl:variable>
<xsl:variable name="rest">
<xsl:value-of select="substring-after($coords,',')" />
</xsl:variable>
<xsl:variable name="latitude">
<xsl:value-of select="substring-before($rest,',')" />
</xsl:variable>
<xsl:variable name="height">
<xsl:value-of select="substring-after($rest,',')" />
</xsl:variable>
<xsl:element name="position">
<xsl:element name="latitude">
<xsl:value-of select="$latitude" />
</xsl:element>
<xsl:element name="longitude">
<xsl:value-of select="$longitude" />
</xsl:element>
<xsl:element name="height">
<xsl:value-of select="$height" />
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
假设
kml前缀绑定到 XSLT 中的正确命名空间(并且,如果您使用 XSLT 2.0,您没有在任何地方都有xpath-default-namespace) 那么这应该可以正常工作。你能发布完整的样式表吗? -
当然。添加了样式表。谢谢!
-
该样式表使用
kml:description,因此它期望description元素位于主KML 命名空间中。对于<description xmlns="">,您必须仅在description上应用模板/匹配。 -
对不起。你能澄清你的建议吗?我尝试使用
,其中模板定义为 但没有用。声明和调用应该是什么?谢谢! -
使用
<xsl:apply-templates select="description" />和<xsl:template match="description">是正确的方法,我刚刚针对您的示例 XML 测试了您提供的样式表版本,它对我来说可以正常工作。您使用的是哪种 XSLT 处理器?
标签: xml xslt namespaces