Xml 由于命名空间声明为空,无法选择XSLT节点
我得到的KML文件的描述标记的名称空间声明为空。详情如下:Xml 由于命名空间声明为空,无法选择XSLT节点,xml,xslt,namespaces,Xml,Xslt,Namespaces,我得到的KML文件的描述标记的名称空间声明为空。详情如下: <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <Placemark> <Point> <coordinates>10.42195,46.9603,0</coordinates> </Point> <Name>Hallo world<
<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>
<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>
正如所建议的,删除与Xalan和EXSLT相关的名称空间问题已经解决。假设
kml
前缀绑定到XSLT中的正确名称空间(并且,如果您使用的是XSLT 2.0,您没有xpath默认名称空间
任何地方),那么应该可以正常工作。你能发布完整的样式表吗?当然。添加了样式表。谢谢该样式表使用kml:description
,因此它希望description
元素位于主kml命名空间中。对于
,您必须仅在说明上应用模板/匹配模板。抱歉。请你澄清一下你的建议好吗?。我尝试使用模板定义所在的位置,但没有成功。声明和呼叫应该是什么?谢谢使用
和
是正确的方法,我刚刚根据示例XML测试了您提供的样式表版本,它对我来说工作正常。您正在使用哪个XSLT处理器?不,冗余名称空间与所述问题无关。这里需要做的就是在对description
元素进行寻址时,在使用该元素的两个位置删除kml:
前缀。
<?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>