2017-10-01 3 views
0

私の最初のquestionのデータに続いて、私は与えられた解を実際のデータに適応させようとします。転倒したウィンドウ内の元のデータへのポインタを保持する方法

<time>ノードを(anwseredとして)グループ化し、ソースドキュメントへのポインタを保持する最適な方法は何ですか?正確には、親ノード<trkpt>にアクセスして、出力の属性をコピーする必要があります。

入力

<?xml version="1.0" encoding="UTF-8"?> 
<gpx 
xmlns="http://www.topografix.com/GPX/1/1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
creator="me" 
version="1.1" 
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 gpx.xsd"> 
    <metadata> 
     <link href="http://www.garmin.com"> 
      <text>Garmin International</text> 
     </link> 
     <time>2017-08-03T11:26:14Z</time> 
    </metadata> 
    <trk> 
     <name>Journal actif: 01 AOUT 2017 16:03</name> 
     <trkseg> 
      <trkpt lat="50.064145" lon="5.194660"> 
       <ele>305.84</ele> 
       <time>2017-08-01T15:25:58Z</time> 
      </trkpt> 
      <trkpt lat="50.062084" lon="5.198431"> 
       <ele>314.49</ele> 
       <time>2017-08-01T15:26:11Z</time> 
      </trkpt> 
      <trkpt lat="50.059504" lon="5.202687"> 
       <ele>321.70</ele> 
       <time>2017-08-01T15:26:27Z</time> 
      </trkpt> 
     </trkseg> 
    </trk> 
    <trk> 
     <name>Journal actif: 01 AOUT 2017 17:26</name> 
     <trkseg> 
      <trkpt lat="50.058567" lon="5.203909"> 
       <ele>323.62</ele> 
       <time>2017-08-01T15:26:32Z</time> 
      </trkpt> 
      <trkpt lat="50.055699" lon="5.207007"> 
       <ele>330.35</ele> 
       <time>2017-08-01T15:26:46Z</time> 
      </trkpt>    
     </trkseg> 
    </trk> 
</gpx> 

予想される出力(部分図)

<trkseg> 
    <trkpt lat="50.064145" lon="5.194660"> 
     <time>2017-08-03T11:26:14Z</time> 
    </trkpt> 

それはライン<xsl:attribute name="lat" select="../@lat"/>で壊し に従うよう私の現在のXSLTはあります。

あなたが合格と( trkpt要素のような)の要素を処理するための関数を書き換える必要があるでしょうし、その後の関数の内部で使用すると、比較のために xs:dateTimeを計算する必要がありますその場合は
<?xml version="1.0" encoding="UTF-8"?> 
<?altova_samplexml file:///C:/Data/Google%20Drive/Projects%20-%20Coding/Xslt/Garmin/01.xml?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mf="http://example.com/mf" exclude-result-prefixes="xs mf" version="2.0" xpath-default-namespace="http://www.topografix.com/GPX/1/1"> 
    <xsl:param name="stop" as="xs:dayTimeDuration" select="xs:dayTimeDuration('PT5M')"/> 
    <xsl:output indent="yes" method="xml" /> 
    <xsl:function name="mf:group" as="element(trk)*"> 
     <xsl:param name="dateTimes" as="xs:dateTime*"/> 
     <xsl:param name="stop" as="xs:dayTimeDuration"/> 
     <xsl:sequence select="mf:group($dateTimes[1], $dateTimes[position() gt 1], $stop)"/> 
    </xsl:function> 
    <xsl:function name="mf:group" as="element(trk)*"> 
     <xsl:param name="group" as="xs:dateTime*"/> 
     <xsl:param name="dateTimes" as="xs:dateTime*"/> 
     <xsl:param name="stop" as="xs:dayTimeDuration"/> 
     <xsl:variable name="next" as="xs:dateTime?" select="$dateTimes[1]"/> 
     <xsl:variable name="end" as="xs:dateTime" select="$group[last()]"/> 
     <xsl:choose> 
      <xsl:when test="not(exists($next))"> 
       <xsl:sequence select="mf:wrap($group)"/> 
      </xsl:when> 
      <xsl:when test="$next - $end gt $stop"> 
       <xsl:sequence select="mf:wrap($group)"/> 
       <xsl:sequence select="mf:group($next, $dateTimes[position() gt 1], $stop)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:sequence select="mf:group(($group, $next), $dateTimes[position() gt 1], $stop)"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:function> 
    <xsl:function name="mf:wrap" as="element(trk)"> 
     <xsl:param name="dateTimes" as="xs:dateTime*"/> 
     <trk xmlns="http://www.topografix.com/GPX/1/1"> 
      <name>TBC</name> 
      <trkseg> 
       <xsl:for-each select="$dateTimes"> 
        <trkpt> 
        <xsl:attribute name="lat" select="../@lat"/> 
        <xsl:attribute name="lon" select="../@lon"/> 
         <time> 
          <xsl:value-of select="."/> 
         </time> 
        </trkpt> 
       </xsl:for-each> 
      </trkseg> 
     </trk> 
    </xsl:function> 
    <xsl:template match="gpx"> 
     <gpx 
     xmlns="http://www.topografix.com/GPX/1/1" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     creator="me" 
     version="1.1" 
     xsi:schemaLocation="http://www.topografix.com/GPX/1/1 gpx.xsd"> 
      <xsl:sequence select="mf:group(.//trkpt/time/xs:dateTime(.), $stop)"/> 
     </gpx> 
    </xsl:template> 
</xsl:stylesheet> 

答えて

0

)、ここにあります関数を修正しようとすると、私はそれを完全にテストしていません:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mf="http://example.com/mf" exclude-result-prefixes="xs mf" version="2.0" xpath-default-namespace="http://www.topografix.com/GPX/1/1"> 
    <xsl:param name="stop" as="xs:dayTimeDuration" select="xs:dayTimeDuration('PT5M')"/> 
    <xsl:output indent="yes" method="xml" /> 
    <xsl:strip-space elements="*"/> 
    <xsl:function name="mf:group" as="element(trk)*"> 
     <xsl:param name="trktpts" as="element(trkpt)*"/> 
     <xsl:param name="stop" as="xs:dayTimeDuration"/> 
     <xsl:sequence select="mf:group($trktpts[1], $trktpts[position() gt 1], $stop)"/> 
    </xsl:function> 
    <xsl:function name="mf:group" as="element(trk)*"> 
     <xsl:param name="group" as="element(trkpt)*"/> 
     <xsl:param name="trkpts" as="element(trkpt)*"/> 
     <xsl:param name="stop" as="xs:dayTimeDuration"/> 
     <xsl:variable name="next" as="element(trkpt)?" select="$trkpts[1]"/> 
     <xsl:variable name="nextDateTime" as="xs:dateTime?" select="$next/time/xs:dateTime(.)"/> 
     <xsl:variable name="end" as="xs:dateTime" select="$group[last()]/time/xs:dateTime(.)"/> 
     <xsl:choose> 
      <xsl:when test="not(exists($next))"> 
       <xsl:sequence select="mf:wrap($group)"/> 
      </xsl:when> 
      <xsl:when test="$nextDateTime - $end gt $stop"> 
       <xsl:sequence select="mf:wrap($group)"/> 
       <xsl:sequence select="mf:group($next, $trkpts[position() gt 1], $stop)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:sequence select="mf:group(($group, $next), $trkpts[position() gt 1], $stop)"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:function> 
    <xsl:function name="mf:wrap" as="element(trk)"> 
     <xsl:param name="trkpts" as="element(trkpt)*"/> 
     <trk> 
      <name>TBC</name> 
      <trkseg> 
       <xsl:apply-templates select="$trkpts"/> 
      </trkseg> 
     </trk> 
    </xsl:function> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="trkpt/ele"/> 

    <xsl:template match="gpx"> 
     <gpx 
      creator="me" 
      version="1.1" 
      xsi:schemaLocation="http://www.topografix.com/GPX/1/1 gpx.xsd"> 
      <xsl:sequence select="mf:group(.//trkpt, $stop)"/> 
     </gpx> 
    </xsl:template> 
</xsl:stylesheet> 
+0

これは完璧に動作しています! –

+0

ああ!エラー "命令スタックオーバーフロー"(altova 2010)を取り除くことはできません。 私は入力ファイルを分割して最小のファイル(1回の旅行で〜5600 trkpt)を取得しましたが、まだこの厄介なエラーが発生します。 –

+0

それが問題の原因である場合は、再帰制限を増やすことができるかどうか/ Altovaサポートまたはフォーラムに問い合わせてください。もしそれがSaxon 9を試すことを提案している問題を解決できないならば、オープンソースのHE版はJavaと.NETのプラットフォームで利用でき、XSLT 2.0の場合は以前に投稿したXQuery 3やXSLT 3ソリューション上記の再帰関数もSaxonの問題を引き起こします。 –

関連する問題