Передача параметров из скрипта в XSL - PullRequest
0 голосов
/ 09 июня 2019

Использование XSLT2 с последним Saxon HE.

Я пытаюсь передать несколько параметров координат из скрипта в XSL, чтобы отфильтровать результаты на основе граничного поля местоположения

Скрипт:

java -jar saxon9he.jar -s:litter_bins.xml -o:"bins.xml" -xsl:"Split xml coords.xsl" Coord_2=51.3725 Coord_4=51.3751 Coord_1=-2.3615 Coord_3=-2.3572

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">   
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>   

    <xsl:param name="Coord_2" select="Coord_2"/>
    <xsl:param name="Coord_4" select="Coord_4"/>
    <xsl:param name="Coord_1" select="Coord_1"/>
    <xsl:param name="Coord_3" select="Coord_3"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="node[@lat[ . &lt; $Coord_2 or . &gt; $Coord_4 ] or @lon[ . &lt; $Coord_1 or . &gt; $Coord_3]]"/>

</xsl:stylesheet>

Вышеприведенное возвращает:

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="JOSM"/>

Однако, если я жестко закодирую координаты в match xpath, он возвращаетожидаемые результаты.

Xpath:

  <xsl:template match="node[@lat[ . &lt; 51.3725 or . &gt; 51.3751 ] or @lon[ . &lt; -2.3615 or . &gt; -2.3572]]"/>

Результаты:

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="JOSM">
   <node id="-102973" visible="true" lat="51.37283499216" lon="-2.359890029">
      <tag k="date_creat" v="17/07/2014 07:59:04 AM UTC"/>
      <tag k="form_recor" v="888"/>
   </node>
<snip...>
</osm>

Что я неправильно понимаю?

1 Ответ

1 голос
/ 09 июня 2019

Попробуйте объявить числовой тип для параметров, например. <xsl:param name="Coord_2" as="xs:double"/> или <xsl:param name="Coord_2" as="xs:decimal"/>. Конечно, для этого ваша таблица стилей должна объявить xmlns:xs="http://www.w3.org/2001/XMLSchema" как объявление пространства имен корневого элемента.

Без числового типа, я думаю, что сравнение будет иметь два xs:untypedAtomic значения, а затем https://www.w3.org/TR/xpath-31/#id-general-comparisons требует

Если оба атомарных значения являются экземплярами xs: untypedAtomic, то значения приводятся к типу xs: string

и тогда сравнение строк отрицательных чисел не даст желаемого результата.

...