Dom4j规则与所有预期节点都不匹配

时间:2009-05-02 20:03:24

标签: java xml xslt dom4j

如果预定义模式// 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模式,得到了所有五个元素。

2 个答案:

答案 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中完成的假设。令人遗憾的是,像StylesheetRule这样的相关课程似乎没有充分记录。 (考虑例如方法run(Node node, String mode),其模式参数似乎完全没有解释。)