Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Saxonb9.0与Saxonb9.1.0.8和xs:boolean与xs:string类型错误_Java_Xml_Xslt_Ant_Saxon - Fatal编程技术网

Java Saxonb9.0与Saxonb9.1.0.8和xs:boolean与xs:string类型错误

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

我已经从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="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–package
libsaxonbjava
中找到文件

更新#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接口上。我会尝试一些实验

  • 尝试从Ant调用一个不设置参数podporaZaostalýchProhlžeč367;的函数(并恢复测试该参数值的代码)。我预测您不会出现最初报告的错误
  • 出于测试目的,将参数的默认值更改为true(在参数声明中使用
    select=“true()”
    )。我再次预测,最初报告的错误不会出现
  • 使用如下所示的简单测试样式表,查看当Ant以各种方式(尤其包括您现在的设置方式)设置参数
    testparm
    时,在9.0和9.1中会发生什么。调整诊断以适应,并在testparm声明中使用和不使用
    as=“xs:boolean”
    进行尝试。如果我正确理解了这种情况,我希望当您使用Ant运行测试样式表时,Saxon 9.0会告诉您testparm是一个布尔值,9.1会告诉您字符串“false”不能转换为布尔值
  • 前两个实验应该确认这个世界不是以任意和反复无常的方式运行的(我总是喜欢在调试时检查),并且您的代码是有意义的。如果成功,第三个实验将隔离传入参数的行为变化,并允许您使用不同的方法从Ant设置参数。(但是,它不会解决您在函数调用中遇到的XSLT到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>
    
    
    测试参数是布尔值。
    测试参数是一个字符串。
    测试参数为十进制。
    测试参数的类型为anyAtomicType。
    测试参数是非类型化的。
    
    使用XSLT而不是Java进行此测试的优点是,只涉及Ant/XSLT接口,而不涉及XSLT调用Java接口


    如果无法找到一种从Ant传递参数的方法,从而在9.0和9.1中成功地生成布尔值,那么您可能需要将参数的类型更改为字符串:许多XSLT程序员使用值“yes”和“no”而不是true()和false(),并以
    test()的形式编写测试,从而延长了他们的寿命=“$parm='yes'”
    。不管是好是坏,字符串都比许多其他类型更好地通过环境边界。

    [不是完整的答案,但可能太多,无法轻松地放入注释中。]

    您的困难似乎(也许是正确的)集中在Ant/XSLT和XSLT/Java接口上

  • 尝试从Ant调用一个不设置参数podporaZaostalýchProhlžeč367;的函数(并还原测试该参数值的代码)
  • 出于测试目的,将参数的默认值更改为true(在参数声明中使用
    select=“true()”
    )。我再次预测最初报告的错误不会出现
  • 使用如下所示的简单测试样式表,查看当Ant以各种方式(尤其包括您现在的设置方式)设置参数
    testparm
    时,9.0和9.1中会发生什么。调整诊断以适应,并使用
    as=“xs:boolean”和不使用
    as=“xs:boolean”进行尝试“
    在testparm声明中。如果我正确理解了这种情况,我希望当您使用Ant运行测试样式表时,Saxon 9.0会告诉您testparm是一个布尔值,9.1会告诉您字符串“false”不能转换为布尔值
  • 前两个实验应该证实这个世界不是beha
    <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'"/>