0

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

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

<#assign deelnemer = body.document[0].form[0].panel[0]>
<#assign UPO = body.document[0].form[0].pensioenGegevens[0]>
...
<div>Document ${body.document.@docId}</div>
<h1>Wijzig gebruiker ${deelnemer.field["@name='name'"]}</h1>

以及以下内容

<document docId="1">
<form>
<panel id="deelnemer">
<field type="text" name="name" id="name">Jansen</field>
<field type="text" name="dateOfBirth" id="dateOfBirth">02-07-1971</field>
<field type="text" name="dateOfEnlistment" id="dateOfEnlistment">01-01-2013</field>
<field type="hidden" name="OIDDln" id="OIDDln">1</field>
<field type="submit" id="submit" name="submit" nextPage="response2">Wijzig</field>
</panel>
<pensioenGegevens/>
</form>
</document>

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

无法对 5 个节点的节点集执行 XPath 查询。期望单个节点。

有问题的指令:

==> ${body.document[0].form[0].panel[0].field["@name='name'"][0]} [在 deelnemer.ftl 的第 23 行第 28 列]

程序员的 Java 回溯:

freemarker.template.TemplateModelException:无法对 5 个节点的节点集执行 XPath 查询。期望单个节点。

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

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

4

1 回答 1

0

当错误消息试图传达时,您只能针对单个节点(或 0 个节点)发出 XPath 查询。据我所知,这是(或者是在编写 FM 时)Xalan 的公共 API 的限制,而不是 FreeMarker 严格的限制。所以尝试改用 Jaxen,它有(或有)限制少得多的 API。将其放入类路径中,并NodeModel.useJaxenXPathSupport()在早期调用。

当然,另一种解决方案是编写${body.document[0].form[0].panel[0]["field/@name='name'"][0]},因为这样可以避免针对多个节点发出 XPath。

顺便说一句,这无关紧要,但我认为您不需要所有(也许都不需要)那些[0]-s。就像因为你只有一个document-s,document[0]实际上与document.

于 2013-09-11T08:59:47.420 回答