如果预定义模式// authorize与以下xml片段中的元素匹配,我正在使用dom4j的规则api来触发操作。
<authorize role_required="admin">
<node title="node which is visible only to admin" path="" >
<authorize role_required="admin">
<node title="node which is visible only to admin" path=""/>
</authorize>
<authorize role_required="admin">
<node title="node which is visible only to admin" path="">
<authorize role_required="admin">
</authorize>
<node title="node which is visible only to admin" path=""/>
</node>
</authorize>
</node>
</authorize>
<authorize role_deny="admin">
<node title="Node which is not visible to admin" path=""/>
</authorize>
不幸的是,它似乎不适用于嵌套元素,只能找到第一级的授权元素。该动作仅触发两次,但有5个授权元素。 有人知道如何解决这个问题吗? 提前谢谢。
我尝试将authorize标记与以下规则匹配:
Rule authorizationRule = new Rule();
authorizationRule.setPattern( DocumentHelper.createPattern( "//authorize" ) );
authorizationRule.setAction( new AuthorizationRule() );
this.stylesheet = new Stylesheet();
this.stylesheet.addRule(authorizationRule);
this.stylesheet.run(document);
规则在第一级的元素上匹配两次。 我用document.selectNodes方法交叉检查了XPath模式,得到了所有五个元素。
答案 0 :(得分:2)
你的规则是否有这条线?
stylesheet.applyTemplates(node);
请记住,你的规则控制着下降到更深层次的元素。
似乎模式不用于选择元素,而是用于在通过树时检查元素是否匹配。如果元素与模式匹配,则会调用您的操作,但您有责任继续使用子元素。如果不这样做,则跳过子元素。
(免责声明:我的理解可能有误,我不使用dom4j,只是看了cookbook)。
答案 1 :(得分:1)
我认为Peter nailed the issue;我只是建立在他的答案之上。
Thomas的代码示例中的这一行有点令人困惑:
authorizationRule.setAction( new AuthorizationRule() );
...除非AuthorizationRule是Action的自定义实现,因为这就是setAction所采用的。
无论如何,使用以下代码,每个五个“授权”元素都会调用action的run方法:
Rule authorizationRule = new Rule();
authorizationRule.setPattern(DocumentHelper.createPattern("//authorize"));
final Stylesheet stylesheet = new Stylesheet();
authorizationRule.setAction(new Action(){
public void run(Node node) throws Exception {
stylesheet.applyTemplates(node);
}
});
stylesheet.addRule(authorizationRule);
stylesheet.run(document);
(仅在将XML片段更改为格式良好的文档后才有效。)
你需要在动作中使用样式表的方式看起来有点尴尬,而且我不确定这样的事情是如何在dom4j中完成的假设。令人遗憾的是,像Stylesheet和Rule这样的相关课程似乎没有充分记录。 (考虑例如方法run(Node node, String mode)
,其模式参数似乎完全没有解释。)