xml - 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,
</xsl:when></xsl:choose>
这是输入xml-
<LotReq>N</LotReq>
注意 - 此标签可以填充 N 或 0。我们正在使用 Saxon 处理器使用 XSL 转换此 XML。
解决方案
在 XPath 2.0+ 中,“=”的操作数必须是可比较的类型:如果一个操作数是字符串而另一个操作数是数字,则会出现错误(如此处)。您应该将数字转换为字符串,或将字符串转换为数字。
这与 XPath 1.0 不同,后者进行了隐式转换(虽然是很久以前的事了,我已经忘记了确切的转换规则)。
在 2.0+ 中,如果参数之一是 xs:untypedAtomic 类型,您仍然可以获得隐式转换 - 这实际上意味着,如果它是一个节点并且没有模式。在这种情况下,节点的字符串值将被转换为另一个操作数的类型。
推荐阅读
- linux - Linux命令Cat不归档归档但归档在文件夹中
- indexeddb - indexedDB w/r 到相同的来源和本地文件
- javascript - 如何在现有的身份验证系统中使用 Snapchat 登录工具包?
- php - 如何从 Apache 执行的 php 脚本启动 solr?
- python - 按 Fn 键 Python 3
- php - 为 woocommerce 缺货产品变体显示自定义 div 块
- android - 后退按钮和搜索视图之间的空间太大 - 是否可以在工具栏上减少它?
- r - 一个数的除数函数
- ruby-on-rails - Ruby on Rails haml 导航栏汉堡菜单
- python - 如何针对我的 keras 训练模型运行测试数据?