Skip to content

Latest commit

 

History

History
61 lines (45 loc) · 1.91 KB

NOTES.md

File metadata and controls

61 lines (45 loc) · 1.91 KB

Het programma compile, dat de Go-bestanden met XPath-expressies compileert naar zuiver Go, maakt gebruik van het programma testXPath dat onderdeel is van de sources van libxml2. Dit is getest met libxml2 versie 2.9.9. Een oudere versie werkte niet goed.


XPath-expressies in Go kunnen gebruikt worden in de functies FIND() en TEST(), waarin de expressie zelf tussen backquotes dient te staan. Met gewone, dubbele aanhalingstekens werkt het niet.


Alleen de indexen [1] en [last()] zijn geïmplementeerd. Andere indexen, zoals [2] of [last()-1] zullen niet werken of een verkeerd resultaat geven, tenzij de implementatie wordt toegevoegd. De index [1] wordt door de compiler omgezet in [first()].


Posities (begin, end, id, head) zijn geïmplementeerd als integers. Houd hier rekening mee als je wilt weten hoeveel posities twee woorden van elkaar af liggen.

interne waarde uitvoer
1000 1
2003 2.3
4050 4.50

De compiler maakt gebruik van libxml2, dat alleen XPath versie 1 kan verwerken.

De compiler herkent reeksen zoals deze, en codeert die op een wijze die libxml2 kan verwerken:

    = ("aap", "noot")

Het isgelijk-teken en de dubbele aanhalingstekens zijn nodig. Deze reeksen worden niet herkend:

    > ("aap", "noot")
    = ('aap', 'noot')

Er zit nogal wat complexiteit in de verwerking van predicaten. Je hebt de ‘gewone’ predicaten, die werken op elke node individueel, en je hebt de index-predicaten, die werken op een of meer sets van nodes. Nog complexer is het wanneer de beide gecombineerd worden. Om de juiste resultaten te krijgen heb ik hier en daar wat houtje-touwtje gebruikt in de methode do van dCollect, in de hoop dat de boel niet breekt. Er is vast een betere manier, maar dan niet zonder simpel platte sets van nodes doorschuiven van de ene naar de volgende stap zoals nu gebeurt.