Несколько проблем здесь.Один из них такой:
<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>