2010-10-15 9 views
9

Wenn ich eine Quelldatei wie diese:Wie machen Sie Wildcard-Matches mit XSLT?

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

Kann ich einen XPath-Ausdruck in meinem Sheet tun, die nur die Tiere, die mit der Zeichenfolge ‚_monkey‘ in ihrem Namen wählt?

z.B. Platzhalterzeichen '* _monkey'?

+0

Welche Version von XSLT verwenden Sie? –

+0

Gute Frage, +1. Siehe meine Antwort für XSLT 1.0 und XSLT 2.0 Lösungen.:) –

+0

@iYasha Ich benutze derzeit 1.0, aber daran interessiert, die Unterschiede zwischen den beiden zu lernen. –

Antwort

26

Kann ich einen XPath-Ausdruck in meinem Sheet, das in ihre Namen nur die Tiere mit dem String ‚_monkey‘ wählt?

z.B. Platzhalterzeichen '* _monkey'?

Diese Wildcard bedeutet eine Zeichenfolge mit "_monkey" enden, nicht eine Zeichenfolge enthält "_monkey".

Verwenden:

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

Die oben verwendet die Standard XPath 2.0 Funktion ends-with() und ist somit nur in XSLT 2.0 zur Verfügung.

In XSLT 1.0 verwenden Sie den folgenden XPath 1.0 Ausdruck:

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

Es ist die // Abkürzung verwendet nicht empfohlen, da diese in ineffizienter Auswertung führen. Verwenden Sie eine spezifischere Kette von Standorttests, wenn die Struktur des XML-Dokuments bekannt ist. Wenn zum Beispiel die animal Elemente alle Kinder des oberen Elements des XML-Dokuments sind, dann sind die folgenden XPath (2,0 oder 1,0, respectively) Ausdrücke könnten effizienter sein:

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

und

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

auf einer spezifischen Bedürfnisse Je (zB Sie wirklich gemeint „enthält“ und nicht „endet mit“), die Funktionen contains(), starts-with() und substring() auch nützlich sein können:

contains(someString, someTargetString) 

starts-with(someString, someTargetString) 

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

Schließlich muss das match-Attribut <xsl:templates> keinen absoluten XPath-Ausdruck enthalten. - Es wird empfohlen, nur einen relativen XPath-Ausdruck zu verwenden, der genügend Kontext angibt.

Somit ist die oben als Spiel Ausdrücke verwendet werden, wie etwas sein:

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

und

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

Schöne Antwort. Vielen Dank! –

+3

+1 Für erweiterte Erklärung. –

+0

Wie kann ich das verwenden: '' in XSLT 1.0? – Si8