我正在尝试使用样式表从GPX文件(XML编码的航路点和轨道)中提取特定节点(trk
)。其他节点wpt
应该被丢弃。
XML就像:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="nüvi 2595" version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v2 http://www.garmin.com/xmlschemas/TrackPointExtensionv2.xsd">
<wpt lat="55.55555" lon="10.0000">
<name>Waypoint</name>
<extensions>
<WaypointExtension>
<Categories>
<Category>Museum</Category>
</Categories>
</WaypointExtension>
</extensions>
</wpt>
<trk>
<name>Sample Track</name>
<trkseg>
<trkpt lat="55.5555" lon="0.0000">
<ele>-39.76</ele>
<time>2011-10-04T12:44:53Z</time>
<extensions>
<TrackPointExtension>
<course>259.76</course>
</TrackPointExtension>
</extensions>
</trkpt>
<trk/>
</trkseg>
</trk>
</gpx>
我的样式表是:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- IdentityTransform -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="wpt"/>
应用样式表(OS X上的xsltproc)始终复制完整文件,忽略最后一个wpt模板。但是,在删除根gpx
节点的元数据属性时,翻译可以正常工作!
我的XSLT文件有什么问题?
答案 0 :(得分:0)
您的文档具有您的模板不匹配的默认命名空间(xmlns="http://www.topografix.com/GPX/1/1"
)。
在模板中为此命名空间定义名称空间前缀:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:g="http://www.topografix.com/GPX/1/1">
然后将其添加到您的模板中:
<xsl:template match="g:wpt"/>
您将根据需要过滤掉wpt
元素(在默认命名空间中)。
共:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:g="http://www.topografix.com/GPX/1/1">
<!-- IdentityTransform -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="g:wpt"/>
</xsl:stylesheet>
答案 1 :(得分:0)
我假设'元数据'属性至少可能意味着xmlns="http://www.topographix.com/GPX/1/1"
声明,也可能是其他声明。这不是属性,它是默认的名称空间声明。
这意味着,您的wpt
元素属于该命名空间,因为它被声明为默认值。但是,样式表中没有默认的名称空间声明,因此它尝试匹配的wpt
元素没有名称空间,并且基本上没有相同的完全限定名称。
当您从源中删除xmlns=".."
命名空间声明时,wpt
元素会丢失它的命名空间,然后CAN可以与您的模板匹配。
您有两种可能的解决方案 - 在样式表中添加默认命名空间,基本上只是源代码中的xmlns=".."
的副本,或添加带有xmlns:gpx=".."
前缀的命名空间并匹配{{ 1}}而不仅仅是gpx:wpt
。