Suite à mon inital question avec des données simplifiées, j'essaie d'adapter la solution donnée à mes données réelles.Comment conserver un pointeur sur les données d'origine dans une fenêtre de culbutage
Je fais maintenant face à ce problème: quelle est la meilleure façon de grouper les nœuds <time>
(comme anwsered) et de garder un pointeur vers le document source. Précisément, j'ai besoin d'accéder au nœud parent <trkpt>
pour copier les attributs dans la sortie.
Entrée
<?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>
Sortie prévue (vue partielle)
<trkseg>
<trkpt lat="50.064145" lon="5.194660">
<time>2017-08-03T11:26:14Z</time>
</trkpt>
Mon xslt actuelle est la suivante Il brise la ligne <xsl:attribute name="lat" select="../@lat"/>
.
<?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>
Cela fonctionne parfaitement! –
Oh non! Je ne peux pas me débarrasser de l'erreur "débordement de la pile d'instructions" (altova 2010). J'ai divisé mon fichier d'entrée pour obtenir le plus petit (~ 5600 trkpt pour 1 trajet), mais je reçois toujours cette erreur désagréable. –
Demandez dans le support ou le forum Altova si/comment vous pouvez augmenter la limite de récursivité si cela est la cause du problème. Si cela ne résout pas le problème, je suggère d'essayer Saxon 9, l'édition open source HE est disponible pour la plate-forme Java et .NET et ouvre la voie aux solutions XQuery 3 ou XSLT 3 que j'ai posté plus tôt si le XSLT 2.0 fonction récursive utilisée ci-dessus pose également problème avec Saxon. –