XSL Stylesheet修正GPX文件wpt节点name字段位置错位问题
问题排查
你之前编写的XSL存在三个核心错误,无法实现修复GPX节点顺序的需求:
- 未声明GPX的默认命名空间:你的GPX文件根节点绑定了
http://www.topografix.com/GPX/1/1作为默认命名空间,XSL中必须显式声明该命名空间才能匹配到对应的节点 - 命名空间定义错误:你之前定义的h命名空间为
www.humminbird.com,少了http://前缀,和原文件的命名空间不一致,导致无法匹配h开头的节点 - 逻辑不符需求:你之前写的XSL逻辑是输出CSV格式内容,不是保留原GPX结构调整节点顺序,所以无法生成符合要求的GPX文件
可用XSL模板
以下模板会保留原GPX文件所有属性、内容,仅调整wpt节点的子节点顺序为你要求的正确格式:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:gpx="http://www.topografix.com/GPX/1/1" xmlns:h="http://www.humminbird.com" version="1.0" exclude-result-prefixes="gpx h"> <xsl:output method="xml" encoding="UTF-8" indent="yes" /> <!-- 身份转换规则:默认拷贝所有原节点、属性不变 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <!-- 重写wpt节点的子节点输出顺序 --> <xsl:template match="gpx:wpt"> <xsl:copy> <!-- 先拷贝wpt的lat、lon属性 --> <xsl:apply-templates select="@*" /> <!-- 按正确顺序输出子节点 --> <xsl:apply-templates select="gpx:ele" /> <xsl:apply-templates select="gpx:time" /> <xsl:apply-templates select="gpx:name" /> <xsl:apply-templates select="gpx:desc" /> <xsl:apply-templates select="gpx:sym" /> <xsl:apply-templates select="gpx:extensions" /> </xsl:copy> </xsl:template> </xsl:stylesheet>
使用说明
直接用你现有支持XSL转换的工具,加载上述模板和你修改过的GPX文件执行转换即可,输出的文件所有wpt节点都会和你给出的第一个正确节点顺序完全一致,空name条目不会受影响。
内容的提问来源于stack exchange,提问作者Mike2718
相关产品推荐
相关产品推荐

