2009-05-02 5 views
2

Ich dom4j Regeln api mit einer Aktion ausgelöst, wenn das vorgegebene Muster // authorise ein Element in dem folgenden XML-Schnipsel übereinstimmt.DOM4J Regel nicht alle erwarteten Knoten entspricht

Leider scheint es, dass es mit verschachtelten Elementen nicht funktioniert, nur die Autorisierung Elemente auf der ersten Ebene gefunden werden. Die Aktion wird nur zweimal ausgelöst, aber es gibt 5 berechtigende Elemente. Hat jemand eine Idee, wie man dieses Problem löst? Vielen Dank im Voraus.

Ich habe versucht, den Autorisieren-Tag mit der folgenden Regel entsprechen:

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); 

entspricht die Regel zwei Mal auf den Elementen auf der Faust Ebene. Ich überprüfte das XPath-Muster mit der document.selectNodes-Methode und erhielt alle fünf Elemente.

+0

Könnten Sie die Frage mit einigen Beispiel-Code anhängen; Wie genau willst du die Elemente anpassen? (Klingt wie XPath ist ein bisschen aus, aber es ist schwer zu sagen von den bereitgestellten Informationen.) – Jonik

Antwort

2

Haben Ihre Regeln diese Zeile?

stylesheet.applyTemplates(node); 

Denken Sie daran, dass Ihre Regeln den Abstieg in tiefere Elemente steuern.

Es scheint, dass Muster nicht für die Auswahl Elemente verwendet werden, aber das Element Treffer für die Überprüfung, wenn durch den Baum gehen. Wenn Element mit dem Muster übereinstimmt, wird Ihre Aktion aufgerufen, es liegt jedoch in Ihrer Verantwortung, in untergeordneten Elementen fortzufahren. Wenn Sie dies nicht tun, werden untergeordnete Elemente übersprungen.

(Haftungsausschluss: Mein Verständnis falsch sein kann, verwende ich dom4j nicht, und nur bei cookbook sah).

+0

Ich habe gerade dies mit dom4j getestet (und frage mich, wie die Stylesheets und Regeln sollen darin arbeiten), und es scheint, Sie haben es genau richtig! – Jonik

1

Ich denke Peter nailed the issue; Ich baue nur auf seine Antwort auf.

Diese Zeile im Codebeispiel von Thomas war ein wenig verwirrend:

authorizationRule.setAction(new AuthorizationRule()); 

... es sei denn, AuthorizationRule eine benutzerdefinierte Implementierung von Action ist, denn das ist, was setAction nimmt.

Wie auch immer, mit dem folgenden Code der Run-Methode der Aktion in der Tat für jeden fünf aufgerufen wird, „autorisiert“ Elemente:

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); 

(funktioniert nur, nachdem den XML-Schnipsel Wechsel zu wohlgeformtem Dokument.)

Die Art, wie Sie das Stylesheet in der Aktion verwenden müssen, scheint ein wenig peinlich zu sein, und ich bin mir nicht sicher, wie diese Art von Sache angenommen in dom4j getan werden soll. Es ist eine Schande, dass relevante Klassen wie Stylesheet und Rule eher unzureichend dokumentiert sind. (Man denke zum Beispiel das Verfahren run(Node node, String mode) dessen Parameter Modus scheint ganz Erklärung fehlt.)