2010-10-15 17 views
9

Jeśli mam plik źródłowy takiego:Jak zrobić wieloznaczne dopasowania z XSLT?

<animal name="fred_monkey" /> 
<animal name="jim_banana" /> 
<animal name="joe_monkey" /> 

mogę zrobić wyrażenie XPath w moim arkusza stylów, który wybiera tylko zwierzęta z napisu „_monkey” w nazwie?

np. symbol wieloznaczny "* _monkey"?

+0

Jaka wersja XSLT używacie? –

+0

Dobre pytanie, +1. Zobacz moją odpowiedź na rozwiązania XSLT 1.0 i XSLT 2.0.:) –

+0

@iYasha Używam obecnie wersji 1.0, ale chcę poznać różnice między nimi. –

Odpowiedz

26

mogę zrobić wyrażenie XPath w moim arkusza stylów, który wybiera tylko zwierząt z string „_monkey” w ich nazwy?

np. symbol wieloznaczny "* _monkey"?

Ten wieloznaczny oznacza ciąg kończąc "_monkey", nie łańcuch zawierający "_monkey".

Zastosowanie:

//animal[ends-with(@name, '_monkey')] 

powyższych zastosowań standardowych funkcji XPath 2.0 ends-with(), a zatem jest dostępna tylko w XSLT 2.0.

XSLT 1,0 użyć następującego XPath 1,0 ekspresji:

//animal[substring(@name, string-length(@name) -6)='_monkey'] 

Nie zaleca się stosowanie skrót //, ponieważ może to prowadzić do nieefektywnego oceny. Użyj bardziej specyficznego łańcucha testów lokalizacji, gdy znana jest struktura dokumentu XML. Na przykład, jeśli animal elementy są wszystkie dzieci z górnego elementu dokumentu XML, a następnie poniższej XPath (2.0 lub 1.0, odpowiednio) wyrażenia może być bardziej efektywny:

/*/animal[ends-with(@name, '_monkey')] 

i

/*/animal[substring(@name, string-length(@name) -6)='_monkey'] 

zależności od konkretnych potrzeb własnych (np naprawdę oznaczało „zawiera”, a nie „kończy się”), funkcje contains(), starts-with() i substring() mogą być również użyteczne:

contains(someString, someTargetString) 

starts-with(someString, someTargetString) 

substring(someString, start-index, length) = someTargetString 

Wreszcie, atrybut match z <xsl:templates> nie musi zawierać bezwzględnego wyrażenia XPath - zaleca się użycie tylko względnego wyrażenia XPath, które określa wystarczająco dużo kontekstu.

Zatem, powyższe stosowane jako wyrażenia mecz będzie coś jak:

<xsl:template match="animal[ends-with(@name, '_monkey')]"> 

i

<xsl:template match= 
    "animal[substring(@name, string-length(@name) -6)='_monkey']"> 
+0

Dobra odpowiedź. Dzięki! –

+3

+1 Dla rozszerzonego wyjaśnienia. –

+0

Jak mogę tego użyć: '' w XSLT 1.0? – Si8