2013-06-20 29 views
7

Pracuję nad parserem XPath, a gramaturami here jako odniesieniem. Byłem zaskoczony, że jest możliwy symbol @ z KindTest. Model KindTest może być node(), comment(), text() lub processing-instruction(xyz) (testują one dla Node Type).Co robi funkcja "@comment()" w XPath?

Moje pytanie brzmi, co one robią w połączeniu ze znakiem @; . Do czego służą:? Czy szukają atrybutów z instrukcjami przetwarzania lub komentarzami w nich?

+0

Jestem ciekaw dlaczego piszesz parsera XPath? Brzmi jak zabawa ... :-) – LarsH

+0

... Trochę z obu :) i :(, heh. Konwertuję udekorowane ITS dokumenty XML na HTML, a ITS musi pozostać, ale HTML musi być całkowicie legalnym, muszę zmienić nazwy wszystkich węzłów w dokumencie, a także pozbyć się większości atrybutów, ale wszystkie XPath w ITS wciąż muszą działać, co oznacza, że ​​muszą być edytowane, aby dopasować Nowe węzły Zdecydowałem, że kilka wyrażeń regularnych nie będzie miało wystarczającego zasięgu, a ja nie wiem wystarczająco dużo o XPath, aby je wykonać, chyba że przyjrzę się pełnej specyfikacji gramatyki, tak czy inaczej –

+1

Wow ... automatyczne edytowanie wyrażeń XPath do Dopasuj przekształcony dokument Nie słyszałam o ludziach próbujących zrobić to wcześniej .. Myślę, że jeśli pozostałe węzły nadal mają te same hierarchiczne relacje, nie byłoby to zbyt trudne ... pod warunkiem, że wyrażenia XPath nie są zbyt zależne od usuwanych węzłów. – LarsH

Odpowiedz

11

@comment() to poprawne wyrażenie ścieżki ścieżki lokalizacji XPath, które gwarantuje, że nic nie zwróci. Technicznie pyta o wszystkie węzły komentarza znalezione wzdłuż osi atrybutu (i nigdy nie znajdziesz żadnych).

Mówię moim uczniom, że /.. to bardziej kompaktowy i czytelny sposób napisania kompletnej ścieżki lokalizacji, która gwarantuje, że nic nie zwróci. Technicznie pyta o rodzica węzła głównego.

+0

Dlaczego jest on wbudowany w gramatykę, jeśli gwarantuje się, że nic nie zwróci? –

+0

Gramatyka jest już dostępna do innych zastosowań. Nie trzeba jawnie zaprzeczać tej możliwości. – GolezTrol

+2

Witamy w SO, panie Holman! Jakość odpowiedzi XSL wzrosła o jeden poziom ... – LarsH

7

NateGlenn, to nie tak, że @comment() jest wbudowany w gramatykę. Po prostu połączenie @ i comment() nie jest specjalnie zabronione.

Jak wiadomo, @ to tylko skrót od osi attribute::. Osie są wbudowane w gramatykę. Testy węzłowe (takie jak node() i comment()) są wbudowane w oddzielną część gramatyki.

Aby zakazana przez gramatykę kombinacja @comment(), musiałby istnieć specjalny przypadek. Możesz myśleć o innych kombinacjach, które nie mają większego sensu, z wyjątkiem zwracania pustego zestawu węzłów: parent::text(), na przykład.

To raczej jak spodziewa 1/0 lub sqrt(-1) być zakazane przez gramatyki C

+1

To interesujące. Nie zdawałem sobie sprawy, że "@" było skrótem od 'attribute ::'. Gramatyka z W3c [here] (http://www.w3.org/2013/01/qt-applets/xpath1/jjdoc.html) podaje 'AbbrevForwardStep :: = (" @ ")? NodeTest', który moim zdaniem byłby lepszy jako 'AbbrevForwardStep :: = (" @ ")? NameTest'. Skoro jest to skrót od 'attribute ::', rozumiem, dlaczego tak się stało. –

+1

@NateGlenn: dobry punkt. Nie zdawałem sobie sprawy (lub zapomniałem), że gramatyka umieszcza "@" w osobnej zasadzie od nieskróconych osi. Ale zastanów się, czy powiedzieli "AbbrevForwardStep :: = (" @ ")? NameTest'. Wtedy nie mogłeś mieć '@comment()', ale nadal możesz mieć 'atrybut :: comment()'. To byłaby dziwna asymetria. Straciłbyś także możliwość wypowiedzenia '@node()', która jest bardziej użyteczną konstrukcją (chociaż AFAICT, to odpowiednik '@ *', którego nie stracisz). – LarsH

+1

Jeśli AbbrevForwardStep został zdefiniowany z NameTest zamiast NodeTest, straciłbyś nie tylko '@comment()', ale także 'comment()' (skrót dla 'child :: comment()') i wszystkie skrócone testy na osi podrzędnej, które nie są testami węzłów. Jednym z powodów traktowania ortogonalności jako celu samego w sobie jest unikanie takich niezamierzonych obrażeń dodatkowych podczas wprowadzania zmian w gramatykach. –