Java Saxonb9.0与Saxonb9.1.0.8和xs:boolean与xs:string类型错误
我已经从SaxonB(XSLT2.0处理器)版本9.0升级到9.1.0.8,我的程序()停止工作 XSLT转换是使用Ant执行的。撒克逊现在抱怨:Java Saxonb9.0与Saxonb9.1.0.8和xs:boolean与xs:string类型错误,java,xml,xslt,ant,saxon,Java,Xml,Xslt,Ant,Saxon,我已经从SaxonB(XSLT2.0处理器)版本9.0升级到9.1.0.8,我的程序()停止工作 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="s
[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"/>
<xsl:variable name="souborDiagramu" select="j:vytvořDiagram(
$zadání,
@orientace = 'vodorovně',
$kompletní,
tokenize(base-uri(), '/')[last()],
@src
)"/>
可以在lucid(9.0)或raring(9.1.0.8)中的inside.deb Files–packagelibsaxonbjava
中找到文件
更新#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:include href="stránka-společné.xsl"/>
<xsl:variable name="souborDiagramu" select="j:vytvořDiagram(
$zadání,
@orientace = 'vodorovně',
$kompletní,
tokenize(base-uri(), '/')[last()],
@src
)"/>
在9.0版本中
<xsl:message>Typ proměnné $podporaZaostalýchProhlížečů = <xsl:value-of select="j:zjistiTyp($podporaZaostalýchProhlížečů)"/></xsl:message>
但是在9.1.0.8中,我得到了错误要求的类型是xs:boolean;提供的值具有xs:string类型
,即使我删除了任何其他障碍(此属性的用法),并且如果我删除了它的最后一次用法,转换仍将继续: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中不同。有没有办法将布尔型参数从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/XSLT和XSLT/Java接口上。我会尝试一些实验
select=“true()”
)。我再次预测,最初报告的错误不会出现李>
testparm
时,在9.0和9.1中会发生什么。调整诊断以适应,并在testparm声明中使用和不使用as=“xs:boolean”
进行尝试。如果我正确理解了这种情况,我希望当您使用Ant运行测试样式表时,Saxon 9.0会告诉您testparm是一个布尔值,9.1会告诉您字符串“false”不能转换为布尔值<?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>
测试参数是布尔值。
测试参数是一个字符串。
测试参数为十进制。
测试参数的类型为anyAtomicType。
测试参数是非类型化的。
使用XSLT而不是Java进行此测试的优点是,只涉及Ant/XSLT接口,而不涉及XSLT调用Java接口
如果无法找到一种从Ant传递参数的方法,从而在9.0和9.1中成功地生成布尔值,那么您可能需要将参数的类型更改为字符串:许多XSLT程序员使用值“yes”和“no”而不是true()和false(),并以
test()的形式编写测试,从而延长了他们的寿命=“$parm='yes'”
。不管是好是坏,字符串都比许多其他类型更好地通过环境边界。[不是完整的答案,但可能太多,无法轻松地放入注释中。]
您的困难似乎(也许是正确的)集中在Ant/XSLT和XSLT/Java接口上
select=“true()”
)。我再次预测最初报告的错误不会出现testparm
时,9.0和9.1中会发生什么。调整诊断以适应,并使用as=“xs:boolean”和不使用as=“xs:boolean”进行尝试“
在testparm声明中。如果我正确理解了这种情况,我希望当您使用Ant运行测试样式表时,Saxon 9.0会告诉您testparm是一个布尔值,9.1会告诉您字符串“false”不能转换为布尔值
<xsl:param name="someParameterUncasted"/>
<xsl:variable name="someParameter" select="$someParameterUncasted cast as xs:boolean"/>
<?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>
<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'"/>