XPath-Abfrageergebnisreihenfolge

8

Für eine andere Frage Ich habe einen XML-Code erstellt, der auf meinem Entwicklungscomputer funktioniert, aber nicht auf Viper-Codepads, wo ich Ich habe es getestet, bevor ich es meiner Antwort hinzugefügt habe.

Ich könnte mein Problem so weit reduzieren, dass sich die Reihenfolge der von DOMXPath::query() zurückgegebenen Knoten zwischen meinem System und dem Codepad unterscheidet.

XML: <test>This is some <span>text</span>, fine.</test>

Wenn ich alle Textknoten //child::text() abfrage, unterscheidet sich das Ergebnis:

Viper Codepad:

%Vor%

Meine Maschine:

%Vor%

Ich bin nicht so erfahren mit xpath, dass ich verstehe, warum das passiert und wie es möglich ist, die Reihenfolge der Rückgabe mit der PHP-Implementierung zu beeinflussen.

Bearbeiten:

Weitere Tests haben ergeben, dass sich LIBXML_VERSION zwischen den beiden Systemen unterscheidet:

%Vor%     
hakre 19.11.2011, 17:10
quelle

5 Antworten

4

Ich könnte den folgenden Fehlerbericht finden, der wie folgt aussieht: Fehler 363252 - Proximity-Position in libxml2's xmlXPathEvalExpression ( ) berichtete am 18. Oktober 2006 und bestätigte, dass es seit Mai 2006 zurückgeht, was vor der fraglichen Version 2.6.26 liegt.

Dies sollte in libxml2 2.6.27 behoben worden sein.

    
hakre 19.11.2011, 19:12
quelle
7

Technisch gibt XPath 1.0 Knoten-Sets statt Knoten-Sequenzen zurück. In der XPath 1.0-Spezifikation gibt es keine Aussage über die Reihenfolge dieser Knoten-Sets - in der Tat, da sie Mengen sind, haben sie keine intrinsische Reihenfolge.

XSLT 1.0 verarbeitet jedoch immer die in XPath 1.0 zurückgegebenen Knotensätze in der Reihenfolge der Dokumente. Aufgrund dieses Präzedenzfalls wird weithin erwartet, dass XPath-Ergebnisse in der Dokumentreihenfolge angezeigt werden, wenn XPath aus anderen Sprachen als XSLT aufgerufen wird. Es gibt jedoch nichts in der Spezifikation, um dies zu garantieren. In XPath 2.0 wird die Benutzererwartung Teil der Spezifikation, und die Ergebnisse eines Pfadausdrucks MÜSSEN sich in der Reihenfolge der Dokumente befinden.

    
Michael Kay 19.11.2011 20:29
quelle
2

Es sieht aus wie ein Fehler in 20626 Version:

Er verarbeitet zuerst alle untergeordneten Textknoten in der Reihenfolge der Dokumente und dann den Inhalt der untergeordneten Elementknoten. Sollte als Ergebnis auf Ihrer Maschine sein

    
Vitaliy 19.11.2011 17:31
quelle
2

XPath ist eine Abfragesprache, daher sollte es nur die Struktur des .xml-Dokuments lesen und niemals ändern. Dies schließt die Knotenreihenfolge ein. In Ihrem ersten Beispiel ist dies jedoch nicht wahr. Das ist also definitiv ein Fehler nach diesem .

    
FailedDev 19.11.2011 17:44
quelle
1

Es scheint, dass Viper Codepad nicht die ausgewählte text() -Knoten in der Tiefe der ersten Dokumentenreihenfolge zurückgibt, sondern eine erste Breitenbewertung durchführt.

Es soll eine Tiefenüberquerung sein.

Saxon, MSXML, Altova XML haben die Ergebnisse jeweils in der Reihenfolge der Tiefe zurückgegeben.

    
Mads Hansen 19.11.2011 17:33
quelle

Tags und Links