2

如果预定义的模式 //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 个授权元素。有人知道如何解决这个问题吗?提前致谢。

我尝试将授权标签与以下规则匹配:

 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 模式,得到了所有五个元素。

4

2 回答 2

2

你的规则有这条线吗?

stylesheet.applyTemplates(node);

请记住,您的规则控制下降到更深的元素。

似乎模式不是用于选择元素,而是用于在遍历树时检查元素是否匹配。如果元素与模式匹配,则调用您的操作,但您有责任在子元素中继续。如果不这样做,则会跳过子元素。

(免责声明:我的理解可能是错误的,我没有使用 dom4j,只是看了cookbook)。

于 2009-05-03T19:53:07.577 回答
1

我认为彼得解决了这个问题;我只是建立在他的回答之上。

Thomas 的代码示例中的这一行有点令人困惑:

 authorizationRule.setAction( new AuthorizationRule() );

...除非 AuthorizationRule 是Action的自定义实现,因为这就是 setAction 所需要的。

无论如何,使用以下代码,确实会为每五个“授权”元素调用操作的 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 中完成。遗憾的是,StylesheetRule等相关类似乎没有充分记录。(考虑例如run(Node node, String mode)模式参数似乎完全缺乏解释的方法。)

于 2009-05-03T20:54:06.557 回答