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>
これは完璧に動作しています! –
ああ!エラー "命令スタックオーバーフロー"(altova 2010)を取り除くことはできません。 私は入力ファイルを分割して最小のファイル(1回の旅行で〜5600 trkpt)を取得しましたが、まだこの厄介なエラーが発生します。 –
それが問題の原因である場合は、再帰制限を増やすことができるかどうか/ Altovaサポートまたはフォーラムに問い合わせてください。もしそれがSaxon 9を試すことを提案している問題を解決できないならば、オープンソースのHE版はJavaと.NETのプラットフォームで利用でき、XSLT 2.0の場合は以前に投稿したXQuery 3やXSLT 3ソリューション上記の再帰関数もSaxonの問題を引き起こします。 –