Xml 如何使用筛选器中的属性寻址节点

Xml 如何使用筛选器中的属性寻址节点,xml,xslt,xpath,freemarker,Xml,Xslt,Xpath,Freemarker,我是FreeMarker的新手。到目前为止,我只使用了XSLT,我想看看FreeMarker作为替代品 我有以下ftl模板(仅相关部分) … Document${body.Document@docId} Wijzig-gebruiker${deelnemer.field[“@name='name'”} 以及以下内容 Jansen 02-07-1971 01-01-2013 1 Wijzig 我希望在使用表达式${deelnemer.field[“@name='name''']}

我是FreeMarker的新手。到目前为止,我只使用了XSLT,我想看看FreeMarker作为替代品

我有以下ftl模板(仅相关部分)




Document${body.Document@docId}

Wijzig-gebruiker${deelnemer.field[“@name='name'”}

以及以下内容




Jansen

02-07-1971

01-01-2013

1

Wijzig





我希望在使用表达式${deelnemer.field[“@name='name''']}时得到Jansen的值,但是我得到了一个异常

无法对包含5个节点的节点集执行XPath查询。应为单个节点

有问题的指令: ==>${body.document[0]。表单[0]。面板[0]。字段[“@name='name'”][0]}[在deelnemer.ftl的第23行第28列] 程序员的Java回溯: freemarker.template.TemplateModelException:无法对包含5个节点的节点集执行XPath查询。应为单个节点

如果我使用deelnemer.field[0],我会看到Jansen的名字如预期的那样出现。所以我觉得给定的XPath表达式不起作用


有人能告诉我我做错了什么吗?

当错误消息试图传达时,您只能对单个节点(或0个节点)发出XPath查询。据我记忆所及,这是(或是在FM编写时)Xalan公共API的一个限制,严格来说不是FreeMarker的限制。因此,请尝试使用Jaxen,因为Jaxen的API限制性要小得多。将其放入类路径,并在早期调用
NodeModel.useJaxenXPathSupport()

另一种解决方案是编写
${body.document[0]。表单[0]。面板[0][“field/@name='name'][0]}
,当然,这样可以避免对多个节点发出XPath


顺便说一句,这是不相关的,但我不认为你需要所有(也许没有)这些
[0]
-s。由于您只有一个
文档
-s,
文档[0]
实际上与
文档

中最初包含的错误消息相同,我将其替换为body.document[0]。表单[0]。面板[0],以查看是否存在差异。谢谢。我现在正在使用Jaxen,现在我得到了以下错误抱歉,缺少了一些东西:deelnemer.ftl表达式deelnemer.field[“@name='name'”中第25行第30列的错误不是数字表达式field不是数字有问题的指令:--------------=>${deelnemer.field[“@name='name'']/field}[在deelnemer.ftl中第25行第28列]------------Java程序员回溯:------freemarker.core.NonNumericalException:deelnemer.ftl Expression deelnemer.field[“@name='name'”]第25行第30列有错误,不是数值表达式字段不是数值表达式,因为您将
/
放在引号外,所以它表示除法。谢谢,您说得对。我更正了表达式,现在得到了以下错误:这里需要字符串、日期或数字,表达式deelnemer.field[“@name='name'”]改为freemarker.template.TemplateBooleanModel$2有问题的指令:--------------==>${deelnemer.field[“@name='name'”}[在deelnemer.ftl的第24行第28列]freemarker.core.NonStringException:deelnemer.ftlbs中第24行第30列出现错误,因为XPath表达式(
@name='name'
)确实具有布尔结果。您的意思是
${deelnemer[“field[@name='name']”]}
(选择
字段
,其中
@name='name'
)。