2010-11-17 13 views
35

Chcę pobrać węzeł z mojego pliku XML, węzeł ma prefiks, taki jak "najnowszy_", ale może się to zmienić i zależy mi, aby mój XSLT był jak najbardziej płynny. Oto XPath chcę użyć:Symbole wieloznaczne XPath na nazwie węzła

/data/stats/*_cost 

ta powinna odpowiadać latest_cost, newest_cost, anything_cost, czy jest jakiś sposób to zrobić?

Pozdrawiam :-)

+0

Zależy, czy XPath 2.0 jest dostępny w danym środowisku. XPath 1.0 nie pozwala na to i 2.0 robi. – Younes

+0

Jeśli chodzi o wyrażenia takie jak '* _cost', nie zezwala na to zarówno XPath 1.0, jak i XPath 2.0. –

Odpowiedz

58

Jest to poprawne wyrażenie XPath 1.0 wich wybrać element z ostatnich 5 charakteru nazwy równej "_cost" w dowolnej przestrzeni nazw.

/data/stats/*[substring(name(), string-length(name()) - 4) = '_cost'] 
+0

Fajny punkt, wprowadziłem to do mojej aplikacji i robi to, czego potrzebuję, bez innych wad, zobacz mój komentarz do reqsquare. Dzięki. –

+0

@ILMV: Jesteś mile widziany. Cieszę się, że ci pomaga. –

+0

+1 i dzięki @ user357812 - jest to bardzo pomocne w moim podobnym przypadku użycia (pasujące sufiksy atrybutów). Jak to zrobić [tutaj] (http://blog.jondh.me.uk/2011/10/simplexml-xpath-selector-attribute-not-having-suffix/), jeśli ktoś jest zainteresowany. – halfer

5

Z XPath 1.0 można użyć /data/stats/*[substring-after(name(), '_cost') = ''] wzór. Sprawdza, czy nazwa elementu kończy się przyrostkiem _cost. W XPath 2.0 jest fn:ends-with(str, str), a odpowiednia ekspersja to *[ends-with(name(), '_cost')].

+0

Dziękuję za odpowiedź, zawiera działa dobrze dla mnie, ponieważ sprawdził, czy ciąg również istnieje. Również moje środowisko nie wydaje się mieć XPath 2. Wiwaty i tak :-) –

+2

jak @ILMV wskazuje, to wybierze element bez "_cost" w nazwie. Sprawdź moją odpowiedź. –

+0

@Alejandro, dzięki za wskazanie mojego błędu. –

5

Można również użyć contains

np

/data/stats[contains(.,'_cost')] 
+0

'.' oznacza całą zawartość tekstową, a to wyrażenie będzie pasowało do wszystkich węzłów 'stats', których zawartość tekstowa zawiera podciąg _const. Brak gwarancji dotyczących nazw stanowisk i węzłów. –

+1

'/ data/stats/* [zawiera (local-name(), '_ cost')]' działałoby jednak ... – annakata

+0

Poszedłem z tym w końcu '[zawiera (local-name(), '_ cost')], nie dyskryminuje pozycji, co jest wstydem, ale w kontekście jej użycia nie ma to większego znaczenia. –

Powiązane problemy