【问题标题】:XSLT node not selectable due to an empty namespace declaration由于命名空间声明为空,XSLT 节点无法选择
【发布时间】: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 命名空间中。对于&lt;description xmlns=""&gt;,您必须仅在description 上应用模板/匹配。
  • 对不起。你能澄清你的建议吗?我尝试使用 ,其中模板定义为
  • 使用 &lt;xsl:apply-templates select="description" /&gt;&lt;xsl:template match="description"&gt; 是正确的方法,我刚刚针对您的示例 XML 测试了您提供的样式表版本,它对我来说可以正常工作。您使用的是哪种 XSLT 处理器?

标签: xml xslt namespaces


【解决方案1】:

按照建议,删除 Xalan 和 EXSLT 相关的命名空间问题已得到解决。

【讨论】:

  • 不,冗余命名空间与所述问题无关。这里需要做的就是在寻址description 元素时删除kml: 前缀,在两个使用它的地方。
猜你喜欢
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
相关资源
最近更新 更多