gpt4 book ai didi

java - SaxonB 9.0 与 SaxonB 9.1.0.8 和 xs :boolean vs. xs:字符串类型错误

转载 作者:行者123 更新时间:2023-12-01 23:44:50 25 4
gpt4 key购买 nike

我已从 SaxonB(XSLT 2.0 处理器)版本 9.0 升级到 9.1.0.8,但我的程序 ( XML Web Generator ) 停止工作。

XSLT 转换是使用 Ant 执行的。撒克逊人现在提示道:

 [xslt] .../stránka.xsl:37: Fatal Error! Required type is xs:boolean; supplied value has type xs:string
[xslt] Failed to process null

但是该 XSLT 文件的第 37 行有:

<xsl:include href="stránka-společné.xsl"/>

这可能不是问题所在。可能在第 47 行,我在

中使用了一个属性(从 Ant 设置)

该属性在包含的 XSL 文件中声明:

<xsl:param name="someProperty" select="false()" as="xs:boolean"/>

我在属性名称中使用 unicode 字符,但它应该可以工作,不是吗? (至少在 9.0 中是有效的)。我尝试使用 ASCII,但没有帮助。

这也与 Ant 或 Java 版本无关,因为它是否有效仅取决于 JAR 文件的路径(9.0 与 9.1.0.8)。

我想让该应用程序与 9.1.0.8 兼容。 (或者这是 SaxonB 中的一个错误?)

我使用过的版本(SHA-256):

3cb7336b154eabfb0d78a1b9b5f7c70e15a9c790193676803fa4391b60de7ebb  saxonb-9.0.jar (working)
dc09c0e3d03609ff3c11b1e19446ca82a5f7f1bc364173b7910f2267312bd7d5 saxonb-9.1.0.8.jar (error described above)

可以找到文件,例如在package.ubuntu.com .deb 文件内部 – 包 libsaxonb-java在清醒(9.0)或稀有(9.1.0.8)中。

更新#1

如果我删除这个有问题的属性(XSLT 中的变量)的使用,我会得到不同的错误:

 [xslt] Failed to process null

BUILD FAILED
…/build.xml:39: ; SystemID: file:…/šablona/makra/diagramy.xsl; Line#: 63; Column#: -1
net.sf.saxon.instruct.TerminationException: Processing terminated by xsl:message at line 89 in diagramy.xsl
at net.sf.saxon.instruct.Message.processLeavingTail(Unknown Source)
at net.sf.saxon.instruct.Choose.processLeavingTail(Unknown Source)
at net.sf.saxon.expr.LetExpression.processLeavingTail(Unknown Source)

这也是特定于版本 9.1.0.8 的(在 9.0 中我没有错误)。在线 diagramy.xsl 第 63 行有:

<xsl:variable name="souborDiagramu" select="j:vytvořDiagram(
$zadání,
@orientace = 'vodorovně',
$kompletní,
tokenize(base-uri(), '/')[last()],
@src
)"/>

哪里@orientace@src源文档中缺少这些属性(在 9.0 中,此类属性被传递给 Java 方法 vytvořDiagram(…) 作为 null 参数)。

更新#2

我用 Java 编写了一个函数来获取属性的类型:

public static String zjistiTyp(Object o) {
if (o == null) {
return "null";
} else {
return o.getClass().getName();
}
}

9.0版本是这样的

<xsl:message>Typ proměnné $podporaZaostalýchProhlížečů = <xsl:value-of select="j:zjistiTyp($podporaZaostalýchProhlížečů)"/></xsl:message>

成功打印:

 [xslt] Typ proměnné $podporaZaostalýchProhlížečů = java.lang.Boolean

但是在 9.1.0.8 中我收到错误 Required type is xs:boolean; supplied value has type xs:string即使我删除了任何其他障碍(此属性的用法),并且如果删除它的最后一个用法,转换也会继续:<xsl:message>Typ proměnné… (但是我无法找出该属性的类型)。

所以它看起来像一个字符串 false (或 true )可以从 Ant 传递到 XSLT,甚至可以使用以下结构在 XSLT 中声明属性:

<xsl:param name="podporaZaostalýchProhlížečů" select="false()" as="xs:boolean"/>

但它不能使用 - 使用此类属性会导致错误(但仅在 9.1.0.8 中 - 在 9.0 中它可以工作)。

更新 #3

我找到了解决部分问题的方法。

<xsl:param name="someParameterUncasted"/>
<xsl:variable name="someParameter" select="$someParameterUncasted cast as xs:boolean"/>

但这很丑陋,因为一个参数需要两个名称——在 Ant 中不同,在 XSLT 中不同。有没有办法将 boolean 类型参数从 Ant 传递到 XSLT?为什么这在 Saxon 9.1.0.8 中停止工作,尽管它在 9.0 中工作?

还有 9.0/9.1.0.8 问题的第二部分:当将某些缺失属性的值传递给 Java 方法时,在 9.0 中它起作用了,而 Java 只是得到了 null。在 9.1.0.8 中它会导致错误。

最佳答案

我相信 Ant 总是以字符串形式提供样式表参数的值。撒克逊人当然无法控制这一点。从你的证据来看(我还没有进行考古学来证实这一点)Saxon 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'"/>

关于java - SaxonB 9.0 与 SaxonB 9.1.0.8 和 xs :boolean vs. xs:字符串类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17254620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com