Таблица стилей XSL для файла gpx

#xml #xslt #gpx

Вопрос:

У меня есть файл gpx, в который я внес некоторые изменения во многие «имена», пока он был в табличном формате. Все в порядке, за исключением того, что он переместил запись «имя» после моей папки «расширения». Он переместил все те, которые я редактировал. Мне нужно, чтобы они вернулись в правильное место, которое находится после «времени». Некоторые записи «пустые», что нормально. Вот пример файла, который я просто назову MadeUp.gpx. 1-я запись правильная, но 2-я в неправильном порядке. Мне просто нужно, чтобы все было отсортировано, как в следующем файле MadeUp.gpx. У меня есть программное обеспечение, которое преобразует файл, если файл шаблона xsl правильный.

 <?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:h="http://www.humminbird.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="Humminbird PC 4.6.1 [Build20190411001]" version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
    <wpt lat="32.02994571203832" lon="-97.42508814212279">
        <ele />
        <time>2021-08-25T20:46:53Z</time>
        <name>Made Up</name>
        <desc />
        <sym>Fish</sym>
        <extensions>
            <h:uniqueid />
            <h:group>My Data</h:group>
            <h:edited />
            <h:visible>true</h:visible>
            <h:spotlock>false</h:spotlock>
            <h:creator />
            <h:viewas>IconOnly</h:viewas>
            <h:color>Magenta</h:color>
            <h:radiustoggle>false</h:radiustoggle>
            <h:radiussafety>false</h:radiussafety>
            <h:radius />
            <h:depth />
            <h:cursordepth />
            <h:temperature />
            <h:version>2</h:version>
        </extensions>
    </wpt>
    <wpt lat="32.03012171740864" lon="-97.42471086455052">
        <ele />
        <time>2021-08-25T20:46:53Z</time>
        <desc />
        <sym>Fish</sym>
        <extensions>
            <h:uniqueid />
            <h:group>My Data</h:group>
            <h:edited />
            <h:visible>true</h:visible>
            <h:spotlock>false</h:spotlock>
            <h:creator />
            <h:viewas>IconOnly</h:viewas>
            <h:color>Magenta</h:color>
            <h:radiustoggle>false</h:radiustoggle>
            <h:radiussafety>false</h:radiussafety>
            <h:radius />
            <h:depth />
            <h:cursordepth />
            <h:temperature />
            <h:version>2</h:version>
        </extensions>
        <name>Made Up</name>
    </wpt>
</gpx>
 

Я попытался создать шаблон xsl на основе правильного формата, но когда я конвертирую файл, он выдает ошибку «недопустимый xml-файл.
Я попытался изменить некоторые примеры, которые нашел в Интернете, но ни один из них не работал правильно. Я ценю любую помощь. Спасибо, что уделили мне время.
Вот что у меня есть для моего файла xsl:

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:h="www.humminbird.com" version="1.0">
    <xsl:output method="xml" encoding="utf-8" indent="no" />
    <xsl:template match="gpx">
        <xsl:text>;lat, lon,  Time, name, desc, sym, extensions, h:uniqueid, h:group, h:edited, h:visible, h:spotlock, h:creator, h:viewas, h:color, h:radiustoggle,h:radiussafety, h:radius, h:depth, h:cursordepth, h:temperature, h:version</xsl:text>
        <xsl:apply-templates select="wpt" />
    </xsl:template>
    <xsl:template match="wpt">
        <xsl:value-of select="@lat" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="@lon" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="time" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="name" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="desc" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="sym" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="extensions" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:uniqueid" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:group" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:edited" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:visible" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:spotlock" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:creator" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:viewas" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:color" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:radiustoggle" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:radiussafety" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:radius" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:depth" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:cursordepth" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:temperature" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="h:version" />
        <xsl:text>,</xsl:text>
    </xsl:template>
</xsl:stylesheet>
 

Ответ №1:

Не уверен, какое программное обеспечение вы используете для преобразования, поэтому я предположу, что вы ограничены XSLT 1.0.

Вот как бы я это сделал:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:gpx="http://www.topografix.com/GPX/1/1">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="gpx:wpt">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()[not(self::gpx:name)]"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="gpx:time">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
        <xsl:apply-templates select="../gpx:name"/>
    </xsl:template>
    
</xsl:stylesheet>
 

Рабочая скрипка: http://xsltfiddle.liberty-development.net/gVAkJ4S

Комментарии:

1. Спасибо Тебе, Дэниел. Это сработало идеально. Я ценю это.