3 回答
我相信 Ant 总是以字符串的形式提供样式表参数的值。撒克逊人当然无法控制这一点。根据您的证据(我还没有做考古来证实这一点)撒克逊 9.0 将提供的值转换为所需的参数类型,而当前版本(大概从 9.1 开始)使用用于函数调用的类型转换规则,它们是比铸造弱。
如果您希望您的样式表可以从最广泛的环境中调用,我建议您定义接受字符串的样式表参数。我们自己(也从 Saxon 9.1 开始)为配置参数做了同样的事情——同样,Ant 总是将这些作为字符串提供,因此我们注意确保所有配置参数都可以以字符串形式提供。
有两个参数允许用户选择是完全可以的:
<xsl:param name="use-macros" as="xs:boolean" select="xs:boolean($use-macros-string)"/>
<xsl:param name="use-macros-string" as="xs:string" select="'false'"/>
[不是一个完整的答案,但可能太多,无法舒适地放在评论中。]
您的困难似乎(也许正确)集中在 Ant/XSLT 和 XSLT/Java 接口上。我会尝试一些实验。
- 尝试从未设置参数 podporaZaostalýchProhlížečů 的 Ant 调用(并恢复测试该参数值的代码)。我预测您不会遇到最初报告的错误。
- 出于测试目的,将参数的默认值更改为 true(
select="true()"
在参数声明中使用)。我再次预测最初报告的错误不会出现。 - 使用如下所示的简单测试样式表来查看 9.0 和 9.1 中 Ant
testparm
以各种方式设置参数时会发生什么(尤其是您现在设置它的方式)。as="xs:boolean"
调整诊断以适应,并在 testparm 的声明中尝试使用和不使用。如果我正确理解了这种情况,我希望当您使用 Ant 运行测试样式表时<param name="testparm" expression="false"/>
,Saxon 9.0 会告诉您 testparm 是一个布尔值,而 9.1 会告诉您字符串“false”不能转换为布尔值。
前两个实验应该确认这个世界没有以任意和反复无常的方式运行(我总是喜欢在调试时检查)并且你的代码是有意义的。如果成功,第三个实验将隔离传入参数的行为变化,并允许您尝试从 Ant 设置参数的不同方法。(但是,它不会对您在函数调用中遇到的 XSLT-to-Java 接口问题做任何事情。)
我希望这有帮助。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0">
<xsl:param name="testparm" as="xs:boolean"/>
<xsl:template match="/">
<xsl:choose>
<xsl:when test="$testparm instance of xs:boolean">
<xsl:message>Test parameter <xsl:value-of
select="$testparm"/> is boolean.</xsl:message>
</xsl:when>
<xsl:when test="$testparm instance of xs:string">
<xsl:message>Test parameter <xsl:value-of
select="$testparm"/> is a string.</xsl:message>
</xsl:when>
<xsl:when test="$testparm instance of xs:decimal">
<xsl:message>Test parameter <xsl:value-of
select="$testparm"/> is decimal.</xsl:message>
</xsl:when>
<xsl:when test="$testparm instance of xs:anyAtomicType">
<xsl:message>Test parameter <xsl:value-of
select="$testparm"/> is of type anyAtomicType.</xsl:message>
</xsl:when>
<xsl:when test="$testparm instance of xs:untypedAtomic">
<xsl:message>Test parameter <xsl:value-of
select="$testparm"/> is untypedAtomic.</xsl:message>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
在 XSLT 而不是 Java 中进行此测试的优点是只涉及 Ant/XSLT 接口,而不涉及 XSLT-calling-Java 接口。
如果在 9.0 和 9.1 中无法找到从 Ant 传递参数的方法,成功地导致布尔值,您可能希望将参数的类型更改为字符串:许多 XSLT 程序员使用这些值过着长寿而富有成效的生活“是”和“否”而不是 true() 和 false(),并将它们的测试写为test="$parm = 'yes'"
. 无论好坏,字符串都比许多其他类型更好地通过环境边界。
Saxon 9.0 将提供的值转换为所需的参数类型,而当前版本(大概从 9.1 开始)使用用于函数调用的类型转换规则,这比转换弱。
我知道如果规范没有涵盖,依靠自动转换是不好的。
如果您希望您的样式表可以从最广泛的环境中调用,我建议您定义接受字符串的样式表参数。
在这种情况下是的,但我的程序确实是“基于 Ant”的,所以它不会伤害我。顺便说一句:例如xsltproc
还支持参数中的 XPath 表达式。
有两个参数允许用户选择是完全可以的
它可以工作,但恕我直言,这只是一种解决方法,XSLT 模板代码不是应该进行输入参数类型转换的正确层——对于每个参数,在每个模板中,一次又一次。
我宁愿改进 Ant 以支持比文本字符串更多的数据类型。有兴趣的可以关注我的活动
错误 21525 - XSLT/param@expression 用作字符串而不是文档中的表达式
我的补丁添加了对以下类型的支持:字符串、布尔值、int、long、double 以及 XSLT 参数中的 XPath 表达式。