Импорт GPX в Filemaker Pro с использованием таблицы стилей XSL - PullRequest
1 голос
/ 08 ноября 2011

Я знаю о GPSbabel и использовал его для преобразования файлов GPX в CSV, которые затем можно импортировать в Filemaker Pro для манипуляции. Однако я хотел бы иметь возможность импортировать файлы GPX более просто и аккуратно в FMP и надеялся, что смогу написать таблицу стилей XSL для преобразования формы XML GPX в грамматику FMPXMLRESULT.

Я смотрю файлы GPX с устройств Garmin Foretrex, Dakota, Nuvi и GPSmap296. Моя последняя попытка создания таблицы стилей XSL (с использованием фрагментов, взятых из различных примеров) выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="xml"/>
    <xsl:template match="trkseg">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <ERRORCODE>0</ERRORCODE>
            <PRODUCT BUILD="01-25-2011" NAME="FileMaker" VERSION="ProAdvanced 11.0v3"/>
            <DATABASE DATEFORMAT="Yyyy-m-d" LAYOUT="" NAME="gpx_import_test.fp7" RECORDS="{@count}"
                TIMEFORMAT="k:mm:ss "/>
            <METADATA>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ele" TYPE="NUMBER"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="lat" TYPE="NUMBER"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="lon" TYPE="NUMBER"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="time_text" TYPE="TEXT"/>
            </METADATA>
            <RESULTSET FOUND="@count">
                <xsl:for-each select="trkpt">
                    <ROW MODID="0" RECORDID="{position()}">
                        <COL>
                            <DATA>
                                <xsl:value-of select="lat"/>
                            </DATA>
                        </COL>
                        <COL>
                            <DATA>
                                <xsl:value-of select="lon"/>
                            </DATA>
                        </COL>
                        <COL>
                            <DATA>
                                <xsl:value-of select="ele"/>
                            </DATA>
                        </COL>
                        <COL>
                            <DATA>
                                <xsl:value-of select="time_text"/>
                            </DATA>
                        </COL>
                    </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>

Когда я пытаюсь использовать приведенную выше таблицу стилей, FMP жалуется на «Ошибка синтаксического анализа XML: неверная структура документа».

Я бы приветствовал любые предложения - наверное, я делаю очень простую и очевидную ошибку.

1010 * привет *

Rowland

Вот отрывочная версия типичного файла GPX из Garmin Dakota 20, который я пытаюсь импортировать.

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1"
xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"
xmlns:wptx1="http://www.garmin.com/xmlschemas/WaypointExtension/v1"
xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
creator="Dakota 20" 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
http://www.garmin.com/xmlschemas/GpxExtensions/v3
http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd
http://www.garmin.com/xmlschemas/WaypointExtension/v1
http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd
http://www.garmin.com/xmlschemas/TrackPointExtension/v1
http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
<metadata>
<link href="http://www.garmin.com">
<text>Garmin International</text>
</link>
<time>2011-10-21T16:55:50Z</time>
</metadata>
<trk>
<name>Current Track: 20 OCT 2011 10:31</name>
<extensions>
<gpxx:TrackExtension>
<gpxx:DisplayColor>Black</gpxx:DisplayColor>
</gpxx:TrackExtension>
</extensions>
<trkseg>
<trkpt lat="51.6084605176" lon="-2.2182025295">
<ele>43.40</ele>
<time>2011-10-20T09:31:44Z</time>
</trkpt>
<trkpt lat="51.6084605176" lon="-2.2182025295">
<ele>47.24</ele>
<time>2011-10-20T09:31:53Z</time>

</trkpt>
</trkseg>
</trk>
</gpx>

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

Несколько проблем здесь.Один из них такой:

<xsl:template match="trkseg">

Вы не запускаете с корня, поэтому процессор XSLT будет обрабатывать корень и все остальные элементы с использованием правил по умолчанию (которые должны выводить значение элемента).Это может добавить дополнительный текст около FMPXMLRESULT.Чтобы исправить это, нам нужно сделать что-то вроде:

<xsl:template match="/">
  <xsl:for-each select="//trkseg/trkpt"> <!-- or use a full path -->
    ...
  </xsl:for-each>

Этого недостаточно, потому что trkseg - это не просто trkseg, это trkseg в пространстве имен GPX.Без надлежащего объявления пространства имен таблица стилей вообще не найдет элементы.И последняя проблема заключается в том, что lat и lon являются атрибутами, и вам нужно ссылаться на них как @lat и @lon.Вот рабочий XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:gpx="http://www.topografix.com/GPX/1/1"
    exclude-result-prefixes="gpx">
    <xsl:output indent="yes" method="xml"/>
    <xsl:template match="/">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <ERRORCODE>0</ERRORCODE>
            <PRODUCT BUILD="01-25-2011" NAME="FileMaker" VERSION="ProAdvanced 11.0v3"/>
            <DATABASE DATEFORMAT="Yyyy-m-d" 
                LAYOUT=""  NAME="gpx_import_test.fp7" RECORDS="{@count}"
                TIMEFORMAT="k:mm:ss "/>
            <METADATA>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ele" TYPE="NUMBER"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="lat" TYPE="NUMBER"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="lon" TYPE="NUMBER"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="time" TYPE="TEXT"/>
            </METADATA>
            <RESULTSET FOUND="count(//gpx:trkseg/gpx:trkpt)">
                <xsl:for-each select="//gpx:trkseg/gpx:trkpt">
                    <ROW MODID="0" RECORDID="{position()}">
                        <COL>
                            <DATA>
                                <xsl:value-of select="@lat"/>
                            </DATA>
                        </COL>
                        <COL>
                            <DATA>
                                <xsl:value-of select="@lon"/>
                            </DATA>
                        </COL>
                        <COL>
                            <DATA>
                                <xsl:value-of select="gpx:ele"/>
                            </DATA>
                        </COL>
                        <COL>
                            <DATA>
                                <xsl:value-of select="gpx:time"/>
                            </DATA>
                        </COL>
                    </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>
0 голосов
/ 20 января 2014

Вот файл xslt для считывания только путевых точек, а не треков: Кстати: я добавил поля время, имя, sym и тип для импорта. Если не требуется, удалите соответствующие строки в этом файле.

Скопируйте и сохраните текст под пунктирной линией в файле с именем "yourchoice.xslt", где "yourchoice" может быть любым именем, которое вы хотите, и используйте это как файл преобразования xslt в filemaker.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:gpx="http://www.topografix.com/GPX/1/1"
    exclude-result-prefixes="gpx">
    <xsl:output indent="yes" method="xml"/>
    <xsl:template match="/">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <ERRORCODE>0</ERRORCODE>
            <PRODUCT BUILD="01-25-2011" NAME="FileMaker" VERSION="ProAdvanced 11.0v3"/>
            <DATABASE DATEFORMAT="Yyyy-m-d" 
                LAYOUT=""  NAME="gpx_import_test.fp7" RECORDS="{@count}"
                TIMEFORMAT="k:mm:ss "/>
            <METADATA>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="latitude" TYPE="NUMBER"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="longitude" TYPE="NUMBER"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="elevation" TYPE="NUMBER"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="time" TYPE="TEXT"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="name" TYPE="TEXT"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="sym" TYPE="TEXT"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="type" TYPE="TEXT"/>
            </METADATA>
            <RESULTSET FOUND="count(gpx:wpt)">
                <xsl:for-each select="gpx:wpt">
                    <ROW MODID="0" RECORDID="{position()}">
                        <COL>
                            <DATA>
                                <xsl:value-of select="@lat"/>
                            </DATA>
                        </COL>
                        <COL>
                            <DATA>
                                <xsl:value-of select="@lon"/>
                            </DATA>
                        </COL>
                        <COL>
                            <DATA>
                                <xsl:value-of select="gpx:ele"/>
                            </DATA>
                        </COL>
                        <COL>
                            <DATA>
                                <xsl:value-of select="gpx:time"/>
                            </DATA>
                        </COL>
                          <COL>
                            <DATA>
                                <xsl:value-of select="gpx:name"/>
                            </DATA>
                        </COL>
                          <COL>
                            <DATA>
                                <xsl:value-of select="gpx:sym"/>
                            </DATA>
                        </COL>
                          <COL>
                            <DATA>
                                <xsl:value-of select="gpx:type"/>
                            </DATA>
                        </COL>
                    </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>
...