我是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查询。期待单个节点。
freemarker.template.TemplateModelException:无法对5个节点的节点集执行XPath查询。期待单个节点。
如果我使用deelnemer.field [0],我看到Jansen这个名字出现了预期。所以我觉得给定的XPath表达式不起作用。
有人能告诉我我做错了吗?
答案 0 :(得分: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
相同。