Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 由于命名空间声明为空,无法选择XSLT节点_Xml_Xslt_Namespaces - Fatal编程技术网

Xml 由于命名空间声明为空,无法选择XSLT节点

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文件的描述标记的名称空间声明为空。详情如下:

<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>