当前位置: 首页 > 知识库问答 >
问题:

Freemarker DOM属性检查不工作

强德厚
2023-03-14

我有以下XML

<OS_LINESTATUS LINENUMBER="1" QUANTITY="6" REQUESTNUMBER="598089607" STATUSCODE="LC"/>
<OS_LINESTATUS LINENUMBER="1" QUANTITY="1" REQUESTNUMBER="725772899" STATUSCODE="LC"/>
<OS_LINESTATUS LINENUMBER="1" REQUESTNUMBER="599927622" STATUSCODE="LI"/>

我有以下freemarker模板,其中xml元素被注入为“元素”。

[<#list elements as element>{"primeLineNo":"${element.OS_LINESTATUS.@LINENUMBER}","poLineStatusInfos":[{"poLineStatus":"${element.OS_LINESTATUS.@STATUSCODE}"<#if element.OS_LINESTATUS.@QUANTITY??>,"poLineStatusQuantity":{"measurementValue":"${element.OS_LINESTATUS.@QUANTITY}","unitOfMeasure":"EA"}</#if>}]}<#sep>,</#sep></#list>]}]}}
==> element.OS_LINESTATUS.@QUANTITY  [in template "suman-xml-to-xml-    orderrequestxform/xml-aggregation/linestatus.ftl" at line 4, column 331]

----
Tip: This XML query result can't be used as string because for that it had   to contain exactly 1 XML node, but it contains 0 nodes. That is, the constructing XML query has found no matches.
freemarker.core.NonStringException: [... Exception message was already  printed; see it above ...]
at freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:390)
at freemarker.core.Expression.evalAndCoerceToString(Expression.java:82)
at freemarker.core.DollarVariable.accept(DollarVariable.java:41)
at freemarker.core.Environment.visit(Environment.java:324)
at freemarker.core.MixedContent.accept(MixedContent.java:54)
at freemarker.core.Environment.visitByHiddingParent(Environment.java:345)
at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:48)
at freemarker.core.Environment.visit(Environment.java:324)
at freemarker.core.MixedContent.accept(MixedContent.java:54)
at freemarker.core.Environment.visitByHiddingParent(Environment.java:345)
at freemarker.core.IteratorBlock$IterationContext.executeNestedBlockInner(IteratorBlock.java:268)
at freemarker.core.IteratorBlock$IterationContext.executeNestedBlock(IteratorBlock.java:220)
at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:194)
at freemarker.core.Environment.visitIteratorBlock(Environment.java:572)
at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:78)
at freemarker.core.IteratorBlock.accept(IteratorBlock.java:64)
at freemarker.core.Environment.visit(Environment.java:324)
at freemarker.core.MixedContent.accept(MixedContent.java:54)
at freemarker.core.Environment.visit(Environment.java:324)
at freemarker.core.Environment.process(Environment.java:302)
at freemarker.template.Template.process(Template.java:325)
at example.aggregation.XmlElementAggregator.output(XmlElementAggregator.java:93)
at example.aggregation.XmlElementAggregator.aggregate(XmlElementAggregator.java:58)
at example.aggregation.XmlElementAggregator.visitAfter(XmlElementAggregator.java:45)
at org.milyn.delivery.sax.SAXHandler.visitAfter(SAXHandler.java:389)
at org.milyn.delivery.sax.SAXHandler.endElement(SAXHandler.java:204)
at org.milyn.delivery.SmooksContentHandler.endElement(SmooksContentHandler.java:96)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.milyn.delivery.sax.SAXParser.parse(SAXParser.java:76)
at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:86)
at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:64)
at org.milyn.Smooks._filter(Smooks.java:526)
at org.milyn.Smooks.filterSource(Smooks.java:482)
at example.TransformerBuilder.transform(TransformerBuilder.java:66)
at example.TransformAggregation.main(TransformAggregation.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

共有1个答案

贲招
2023-03-14

#if条件有效,因为您要询问element.os_linestatus.@quantity是否存在,因为它是大小为0的结果集。改为使用element.os_linestatus.@quantition[0]??。这就是FreeMarker的DOM包装器的棘手之处,即使查询没有发现什么也会返回一些东西。这就是为什么这样一个结果是#list-able,更重要的是,它可以成为进一步XPath查询的上下文(比如element.Maybemissingelement.child从不失败,只是有时会给出一个空的结果集)。

 类似资料:
  • 问题内容: 我需要一种检查类的方法,以便可以安全地标识哪些属性是用户定义的类属性。问题是,像DIR功能(),inspect.getmembers()和朋友返回所有类的属性包括预定义的像:,,,。这当然是可以理解的,并且可以说我可以列出一个要忽略的命名成员列表,但是不幸的是,这些预定义属性必定会随着不同版本的Python发生变化,因此使我的项目在python项目中容易发生变化- 我不喜欢那样。 例:

  • 我使用以下断言,但失败了。这是在AssertJ中测试JSON的正确方法吗。

  • 属性检查器 是我们查看并编辑当前选中节点、节点组件和资源的工作区域。在 场景编辑器、层级管理器 中选中节点或者在 资源管理器 中选中资源,就会在 属性检查器 中显示它们的属性,可供查询和编辑。 节点名称和激活开关 左上角的复选框表示节点的激活状态,使用节点处于非激活状态时,节点上所有图像渲染相关的组件都会被关闭,整个节点包括子节点就会被有效的隐藏。 节点激活开关右边显示的是节点的名称,和 层级管理

  • 属性检查器 是我们查看并编辑节点或资源属性的重要渠道。可编辑节点的位置,节点上的组件,图片,材质,模型等资源,面板功能细节多,较为复杂。 在 场景编辑器 ,层级管理器 选中节点,或者在 资源管理器 选中资源,就能在 属性检查器 中显示并开始编辑它的属性。 头部公共部分 左边的 两个箭头 是历史记录,点击可切换编辑项; 右边的 锁图标 可锁定面板,固定住编辑的对象,不让面板随新的选中项而变动。 编辑

  • 我正在使用log4j 2.4,并尝试将转换为,但是似乎不能使用log4j2.properties。 null 虽然以下文档https://logging.apache.org/log4j/2.x/manual/configuration.html#属性 清楚地表明 属性配置文件支持广告客户、monitorInterval、name、packages、shutdownHook、status 我也尝试

  • 我有一个复杂的对象我想检查是否有效。我有一个方法来检查它,但是C#可为空性检查不知道它们: 有没有办法在这里应用类似TypeScript的类型门的东西?如果为true,那么我们知道不是null,但是C#分析器看不到函数内部。如果我内联检查它可以,但我是复制粘贴代码,这是一个简单的例子。 是否有任何注释或模式,我可以有空性分析与更复杂的检查?