首页 > 解决方案 > FORG0001:无法将字符串“N”转换为双精度

问题描述

我有 XSL 语句,当它作为 XSL 转换运行时,出现以下错误-

2020-06-30 18:29:24.307  INFO 23756 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
Error evaluating ($trackCountryOfOrigin = 0 or $trackCountryOfOrigin = "N" or $trackCountryOfOrigin = "") in xsl:when/@test on line 103 column 123 of WMOSToSC2020_Item.xsl:
  FORG0001: Cannot convert string "N" to double
; SystemID: file:/C:/SCPP20/scpp-sc2020-interface-migration-master@3ec266adf36/./xslt/WMOSToSC2020_Item.xsl; Line#: 103
ValidationException: Cannot convert string "N" to double
        at net.sf.saxon.type.ValidationFailure.makeException(ValidationFailure.java:392)
        at net.sf.saxon.type.ValidationFailure.asAtomic(ValidationFailure.java:417)
        at net.sf.saxon.expr.sort.UntypedNumericComparer.quickComparison(UntypedNumericComparer.java:158)
        at net.sf.saxon.expr.sort.UntypedNumericComparer.quickCompare(UntypedNumericComparer.java:58)
        at net.sf.saxon.expr.GeneralComparison.compare(GeneralComparison.java:829)
        at net.sf.saxon.expr.GeneralComparison.evaluateManyToOne(GeneralComparison.java:704)
        at net.sf.saxon.expr.GeneralComparison.effectiveBooleanValue(GeneralComparison.java:651)
        at net.sf.saxon.expr.OrExpression.effectiveBooleanValue(OrExpression.java:133)
        at net.sf.saxon.expr.OrExpression.effectiveBooleanValue(OrExpression.java:133)
        at net.sf.saxon.expr.instruct.Choose.choose(Choose.java:917)
        at net.sf.saxon.expr.instruct.Choose.processLeavingTail(Choose.java:892)
        at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:735)
        at net.sf.saxon.expr.LetExpression.processLeavingTail(LetExpression.java:721)
        at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:735)
        at net.sf.saxon.expr.LetExpression.processLeavingTail(LetExpression.java:721)
        at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:735)
        at net.sf.saxon.expr.LetExpression.processLeavingTail(LetExpression.java:721)
        at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:735)
        at net.sf.saxon.expr.LetExpression.processLeavingTail(LetExpression.java:721)
        at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:735)
        at net.sf.saxon.expr.instruct.Instruction.process(Instruction.java:132)
        at net.sf.saxon.expr.LetExpression.process(LetExpression.java:608)
        at net.sf.saxon.expr.instruct.ForEach.lambda$processLeavingTail$0(ForEach.java:484)
        at net.sf.saxon.om.SequenceIterator.forEachOrFail(SequenceIterator.java:128)
        at net.sf.saxon.expr.instruct.ForEach.processLeavingTail(ForEach.java:484)
        at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:735)
        at net.sf.saxon.expr.instruct.TemplateRule.applyLeavingTail(TemplateRule.java:349)
        at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:485)
        at net.sf.saxon.trans.XsltController.applyTemplates(XsltController.java:733)
        at net.sf.saxon.s9api.AbstractXsltTransformer.applyTemplatesToSource(AbstractXsltTransformer.java:348)
        at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:341)

这是我的 xsl 声明-

<xsl:variable name="trackCountryOfOrigin" select="LotReq"/>
    <xsl:choose><xsl:when test="$trackCountOfOrg=0 or $trackCountOfOrg='N' or $trackCountOfOrg=''">"trackCountOfOrg": 0,&#xa;</xsl:when></xsl:choose>

这是输入xml-

<LotReq>N</LotReq>

注意 - 此标签可以填充 N 或 0。我们正在使用 Saxon 处理器使用 XSL 转换此 XML。

标签: xmlxsltxpathsaxon

解决方案


在 XPath 2.0+ 中,“=”的操作数必须是可比较的类型:如果一个操作数是字符串而另一个操作数是数字,则会出现错误(如此处)。您应该将数字转换为字符串,或将字符串转换为数字。

这与 XPath 1.0 不同,后者进行了隐式转换(虽然是很久以前的事了,我已经忘记了确切的转换规则)。

在 2.0+ 中,如果参数之一是 xs:untypedAtomic 类型,您仍然可以获得隐式转换 - 这实际上意味着,如果它是一个节点并且没有模式。在这种情况下,节点的字符串值将被转换为另一个操作数的类型。


推荐阅读