0
4

3 回答 3

2

我相信 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'"/>
于 2013-06-24T08:39:59.660 回答
1

[不是一个完整的答案,但可能太多,无法舒适地放在评论中。]

您的困难似乎(也许正确)集中在 Ant/XSLT 和 XSLT/Java 接口上。我会尝试一些实验。

  1. 尝试从未设置参数 podporaZaostalýchProhlížečů 的 Ant 调用(并恢复测试该参数值的代码)。我预测您不会遇到最初报告的错误。
  2. 出于测试目的,将参数的默认值更改为 true(select="true()"在参数声明中使用)。我再次预测最初报告的错误不会出现。
  3. 使用如下所示的简单测试样式表来查看 9.0 和 9.1 中 Anttestparm以各种方式设置参数时会发生什么(尤其是您现在设置它的方式)。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'". 无论好坏,字符串都比许多其他类型更好地通过环境边界。

于 2013-06-22T22:05:28.990 回答
0

Saxon 9.0 将提供的值转换为所需的参数类型,而当前版本(大概从 9.1 开始)使用用于函数调用的类型转换规则,这比转换弱。

我知道如果规范没有涵盖,依靠自动转换是不好的。

如果您希望您的样式表可以从最广泛的环境中调用,我建议您定义接受字符串的样式表参数。

在这种情况下是的,但我的程序确实是“基于 Ant”的,所以它不会伤害我。顺便说一句:例如xsltproc还支持参数中的 XPath 表达式。

有两个参数允许用户选择是完全可以的

它可以工作,但恕我直言,这只是一种解决方法,XSLT 模板代码不是应该进行输入参数类型转换的正确层——对于每个参数,在每个模板中,一次又一次。

我宁愿改进 Ant 以支持比文本字符串更多的数据类型。有兴趣的可以关注我的活动

错误 21525 - XSLT/param@expression 用作字符串而不是文档中的表达式

我的补丁添加了对以下类型的支持:字符串、布尔值、int、long、double 以及 XSLT 参数中的 XPath 表达式。

于 2013-06-28T17:43:24.010 回答