如何使用过滤器中的属性寻址节点

时间:2013-09-11 08:05:14

标签: xml xslt xpath freemarker

我是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查询。期待单个节点。

有问题的指示:

==&GT; $ {body.document [0] .form [0] .panel [0] .field [“@ name ='name'”] [0]} [第23行,deelnemer.ftl第28列]

程序员的Java回溯:

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

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

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

1 个答案:

答案 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相同。