Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Xslt 具有名称空间的GPX文件的XPath查询?_Xslt_Xpath_Gpx - Fatal编程技术网

Xslt 具有名称空间的GPX文件的XPath查询?

Xslt 具有名称空间的GPX文件的XPath查询?,xslt,xpath,gpx,Xslt,Xpath,Gpx,当GPX文件具有以下简单结构时,我可以通过xpath表达式访问节点: <gpx> <trk> <trkseg> <trkpt lat="50.5324906" lon="7.0842605"> <ele>105.8824463</ele> <time>2010-07-11T08:50:16Z</time> </trkpt>

当GPX文件具有以下简单结构时,我可以通过xpath表达式
访问
节点:

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

105.8824463
2010-07-11T08:50:16Z
108.7662354
2010-07-11T08:50:44Z
...
当涉及名称空间时,如何实现相同的效果,例如:

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

在XSLT 1.0中:

<xsl:apply-templates 
    select="/g:gpx/g:trk/g:trkseg/g:trkpt"
    xmlns:g="http://www.topografix.com/GPX/1/1"/> 
在XSLT1.0中:

<xsl:apply-templates 
    select="/g:gpx/g:trk/g:trkseg/g:trkpt"
    xmlns:g="http://www.topografix.com/GPX/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>

但通常最好使用显式名称空间。

需要记住的是,默认名称空间与空名称空间不同,在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>

但通常最好使用显式名称空间。

@Flack:谢谢!这让我有点夸张了。@Flack:谢谢!这让我觉得有点夸张。
<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
<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>
select='//*[local-name(.)="trkpt"]'