2010-10-15 12 views
9

Böyle bir kaynak dosyası varsa:XSLT ile joker maçlarını nasıl yapıyorsunuz?

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

Onların adına dize '_monkey' ile sadece hayvanlar seçer benim stil bir XPATH ifadesini yapabilir mi?

örn. joker maçı '* _monkey'?

+0

XSLT'DE hangi sürümünü kullanıyorsunuz: yukarıdaki gibi bir şey olacak maç ifadeler olarak kullanılan Böylece

? –

+0

İyi soru, +1. XSLT 1.0 ve XSLT 2.0 çözümleri için cevabımı görün.:) –

+0

@iYasha Şu anda 1.0 kullanıyorum, ancak ikisi arasındaki farkları öğrenmekle ilgileniyorum. –

cevap

26

Ben adlarında dize '_monkey' ile sadece hayvan seçer benim stil bir XPATH ifadesini yapabilir mi?

örn. joker maçı '* _monkey'?

Bu joker değil "_monkey" içeren bir dize "_monkey" ile biten bir dize anlamına gelir.

kullanımı:

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

üzerinde standart XPath 2.0 fonksiyonu ends-with() kullanır ve sadece XSLT 2.0 böylece kullanılabilir. Verimsiz değerlendirme sebep olabilir // kısaltma kullanımı tavsiye edilmez

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

: XSLT'de 1.0'da

aşağıdaki Xpath 1.0 ifade kullanın. XML belgesinin yapısı bilindiğinde, daha spesifik konum testi testleri kullanın. animal elemanları daha sonra XML belgesine aşağıdaki XPath üst elemanın bütün çocuklar (2.0 veya 1.0, sırasıyla) ise Örneğin, ifadeler daha verimli olabilir:

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

ve

/*/animal[substring(@name, string-length(@name) -6)='_monkey'] 
(örneğin eğer gerçekten demek "içerir" ve "ile biten") kişinin özel ihtiyaçlarına bağlı olarak

, fonksiyonlar contains(), starts-with() ve substring() da yararlı olabilir:

contains(someString, someTargetString) 

starts-with(someString, someTargetString) 

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

Son olarak, <xsl:templates>'un match özniteliğinin, mutlak bir XPath ifadesi içermesi gerekmez - yalnızca yeterli bağlamın kullanılması önerildiğini belirten göreli bir XPath ifadesi kullanılmalıdır.

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

ve

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

Güzel cevap. Teşekkürler! –

+3

+1 Genişletilmiş açıklama için. –

+0

Bunu nasıl kullanabilirim: 'XSLT 1.0? – Si8