1

GPX ファイルが次の単純な構造の場合、<trkpt></trkpt>xpath 式でノードにアクセスできます。<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">
4

2 に答える 2

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&#xA;</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&#xA;</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
于 2010-07-29T16:55:41.867 に答える
1

覚えておくべきことは、デフォルトの名前空間は null 名前空間と同じではないということです。xslt では、パスに名前空間を指定しないことは null 名前空間であり、デフォルトではありません。(ただし、デフォルトの名前空間はリテラルに対して有効であると思います。)したがって、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"]'

ただし、一般的には、明示的な名前空間を使用する方が適切です。

于 2010-07-29T16:57:57.833 に答える