You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Saxon HE的XSLT2传坐标参数过滤XML失败问题咨询

问题原因与修复方案

你遇到的问题主要来自两个关键错误:参数默认值的写法错误,以及命令行传入的参数类型不匹配导致数值比较失效。

1. 参数默认值的错误写法

你当前的参数定义:

<xsl:param name="Coord_2" select="Coord_2"/>

这里的select="Coord_2"是告诉XSLT去当前上下文节点下查找名为Coord_2的子元素,而不是引用命令行传入的同名参数。当没有找到这个元素时,参数会被设为空值,这直接导致后续的比较逻辑完全失效。

正确的写法应该是不指定select属性(让命令行传入的值直接生效),或者给一个合理的默认数值:

<xsl:param name="Coord_2"/>
<!-- 或者带默认值的写法 -->
<xsl:param name="Coord_2" select="0.0"/>

2. 字符串与数字的类型不匹配

命令行传入的参数默认是字符串类型,而XML中@lat和@lon属性的数值虽然以字符串形式存储,但XPath会自动按数值逻辑处理。直接用字符串和数值比较会出现非预期结果(比如字符串比较是按字符顺序判断,而非数值大小)。

你需要显式将参数转换为数值类型,使用number()函数处理即可。

修正后的完整XSL代码

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

<!-- 正确定义参数,避免错误的select默认值 -->
<xsl:param name="Coord_2"/>
<xsl:param name="Coord_4"/>
<xsl:param name="Coord_1"/>
<xsl:param name="Coord_3"/>

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

<!-- 转换参数为数值后再执行边界比较 -->
<xsl:template match="node[
    @lat[ number(.) &lt; number($Coord_2) or number(.) &gt; number($Coord_4) ] 
    or 
    @lon[ number(.) &lt; number($Coord_1) or number(.) &gt; number($Coord_3) ]
]"/>
</xsl:stylesheet>

补充优化建议

如果你使用的Saxon HE 9.x支持XSLT 2.0,还可以在参数定义时直接指定类型,让参数自动转换为数值,写法更严谨:

<xsl:param name="Coord_2" as="xs:double"/>

这种写法在命令行传入非数值时会直接报错,能更快排查参数格式问题。

执行你原来的命令行指令,就能得到预期的过滤结果了。

内容的提问来源于stack exchange,提问作者DaveF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:06:07