当GPX文件具有以下简单结构时,我能够通过xpath表达式<trkpt></trkpt>
访问<xsl:for-each select='gpx/trk/trkseg/trkpt'>
个节点:
<gpx>
<trk>
<trkseg>
<trkpt lat="50.5324906" lon="7.0842605">
<ele>105.8824463</ele>
<time>2010-07-11T08:50:16Z</time>
</trkpt>
<trkpt lat="50.5323745" lon="7.0843524">
<ele>108.7662354</ele>
<time>2010-07-11T08:50:44Z</time>
</trkpt>
...
</trkseg>
</trk>
</gpx>
如果涉及名称空间,我如何实现相同的效果,例如:
<gpx xmlns="http://www.topografix.com/GPX/1/1"
creator="MapSource 6.15.11"
version="1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1
http://www.topografix.com/GPX/1/1/gpx.xsd">
答案 0 :(得分:6)
在XSLT 1.0中:
<xsl:apply-templates
select="/g:gpx/g:trk/g:trkseg/g:trkpt"
xmlns:g="http://www.topografix.com/GPX/1/1"/>
在XSLT 2.0中:
<xsl:apply-templates
select="/gpx/trk/trkseg/trkpt"
xpath-default-namespace="http://www.topografix.com/GPX/1/1"/>
因此,您需要在样式表中声明名称空间(前缀,URI),并在XPath表达式的QName测试中添加此名称空间。
例如,这个XSLT 1.0样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:g="http://www.topografix.com/GPX/1/1">
<xsl:output method="text"/>
<xsl:template match="g:trkpt">
<xsl:text>Found 'trkseg' element
</xsl:text>
</xsl:template>
</xsl:stylesheet>
这个XSLT 2.0样式表:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://www.topografix.com/GPX/1/1">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="trkpt">
<xsl:text>Found 'trkseg' element
</xsl:text>
</xsl:template>
</xsl:stylesheet>
使用此输入:
<gpx xmlns="http://www.topografix.com/GPX/1/1"
creator="MapSource 6.15.11"
version="1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1
http://www.topografix.com/GPX/1/1/gpx.xsd">
<trk>
<trkseg>
<trkpt lat="50.5324906" lon="7.0842605">
<ele>105.8824463</ele>
<time>2010-07-11T08:50:16Z</time>
</trkpt>
<trkpt lat="50.5323745" lon="7.0843524">
<ele>108.7662354</ele>
<time>2010-07-11T08:50:44Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
两个输出:
Found 'trkseg' element
Found 'trkseg' element
答案 1 :(得分:1)
要记住的是默认命名空间与空命名空间不同,而在xslt中,未在路径中指定命名空间是空命名空间,而不是默认命名空间。 (默认命名空间对文字有效,我相信。) 因此,在xsl样式表中,您需要使用前缀指定GPX名称空间 并在您的路径中使用该前缀:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:gpx="http://www.topografix.com/GPX/1/1" >
<xsl:template match="/">
<xsl:for-each select='gpx:gpx/gpx:trk/gpx:trkseg/gpx:trkpt'>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
您还可以使用路径中的local-name()等函数进行匹配:
select='//*[local-name(.)="trkpt"]'
但通常最好使用显式名称空间。