2012-04-13 13 views
1

Wenn ich einen Kontextknoten, einen XPath-Ausdruck und einen Knoten habe, kann ich überprüfen, ob mein Knoten den XPath-Ausdruck in diesem Kontext erfüllt.Gibt es eine Möglichkeit, eine umgekehrte XPath-Abfrage auszuführen?

Ich habe XPath-Abfragen, die sehr teuer sind und lange dauern. Hier möchte ich einfach einen potentiellen Ergebnisknoten nehmen und prüfen, ob er die Abfrage erfüllt, d. H. Er würde als Teil der Abfrageergebnismenge zurückgegeben werden.

Ich bin mit Saxon EE 9.3

+1

Willkommen bei [SO]. Bitte nehmen Sie sich etwas Zeit, um die [faq] zu lesen und Code anzuzeigen. – zzzzBov

+0

Hängt von der Abfrage ab, aber mein allgemeiner Ansatz wäre, ein viel kleineres XML-Dokument um meinen Kandidatenknoten herum zu erstellen und die Abfrage darauf zu testen. – biziclop

+0

Dies war eigentlich unser erster Ansatz und würde wahrscheinlich in den meisten Fällen ziemlich gut funktionieren, aber wie Sie richtig angemerkt haben, hängt es von der Abfrage ab, und dies ist ein allgemeiner Abfrageprozessor, so dass wir nicht viel annehmen können Abfrage. –

Antwort

0

Wenn Ihr Kontextknoten $ N, Ihr Ausdruck ist E, und der Knoten getestet werden, ist $ T, dann ist der Ausdruck boolean($N/(EXP) intersect $T) tut, was Sie für die im ersten Teil fragen deiner Frage. Es erfüllt jedoch möglicherweise nicht die im zweiten Teil der Frage implizierte Anforderung, dass die Berechnung schneller sein sollte als die Auswertung von EXP.

Wenn der Ausdruck EXP die Form eines XSLT-Musters hat, lautet die Antwort ja, es gibt einen Weg, und es ist wahrscheinlich schneller (obwohl das hängt davon ab, welche sächsischen APIs Sie verwenden). Beachten Sie, dass, wenn EXP ein Muster ist, die Frage, ob $ T mit dem Muster übereinstimmt, nicht davon abhängt, einen Kontextknoten $ N zu kennen.

+0

Die meisten Fälle sind XPath-Ausdrücke. Es kann so einfach sein wie './element(inventoryElement, Project) [@ name = $ name]' oder es könnte './/element(*, ReferenceKey)' oder ein komplexerer Fall sein, der die verschiedenen Achsen auf und ab navigiert (Raten Sie, es ist der Plural der Achse). Wenn das oben für Kind Kind Achse Fälle schneller ist, ist das fantastisch, da dies 95% der Anwendungsfälle abdeckt. Offensichtlich kann eine doppelte Schrägstreich-Abfrage insbesondere den gesamten Baum durchwandern, während ein Knoten $ T genommen wird und gezeigt wird, dass es tatsächlich "ein Kind" von $ N gemäß Ausdruck E ist, würde dies nicht das Parsen des gesamten Baums beinhalten. –

Verwandte Themen