webentwicklung-frage-antwort-db.com.de

XSL-Teilzeichenfolge und IndexOf

Ich bin neu bei XSLT. Ich frage mich, ob es möglich ist, eine Teilzeichenfolge eines Elements auszuwählen. Ich versuche, einen RSS-Feed zu analysieren. Der Beschreibungswert enthält mehr Text als ich anzeigen möchte. Ich möchte einen Teil davon basierend auf dem Index eines Teilstrings erhalten. Grundsätzlich möchte ich das Ergebnis eines Teilstring-Aufrufs, der indxOf ('some_substring') übergibt, und eine Länge als Parameter anzeigen. Ist das möglich?

aus Kommentaren:

Ich möchte den Text einer Zeichenfolge auswählen, die sich nach dem Auftreten der Teilzeichenfolge befindet

22
Carlos Blanco

Es ist nicht genau klar, was Sie mit dem Index eines Teilstrings tun möchten [Update: Es ist jetzt klarer - danke], aber Sie können möglicherweise die Funktion substring-after Oder substring-before Verwenden:

substring-before('My name is Fred', 'Fred')

gibt 'My name is ' zurück.

Wenn Sie eine genauere Steuerung benötigen, kann die Funktion substring() zwei oder drei Argumente annehmen: string, starting-index, length. Lassen Sie die Länge aus, um den gesamten Rest der Zeichenfolge zu erhalten.

In XPath gibt es keine index-of() -Funktion für Zeichenfolgen (nur für Sequenzen in XPath 2.0). Sie können string-length(substring-before($string, $substring))+1 verwenden, wenn Sie die Position speziell benötigen.

Es gibt auch contains($string, $substring). Diese sind alle dokumentiert hier . In XPath 2.0 können Sie den Abgleich mit regulären Ausdrücken verwenden.

(XSLT verwendet meistens XPath zur Auswahl von Knoten und zur Verarbeitung von Werten. Dies ist also eher eine XPath-Frage. Ich habe sie so markiert.)

46
LarsH

Hier sind einige einzeilige xpath 1.0-Ausdrücke für IndexOf ($ text, $ searchString):

Wenn Sie die Position des ERSTEN Zeichens der gesuchten Zeichenfolge benötigen, oder 0, wenn es nicht vorhanden ist:

contains($text,$searchString)*(1 + string-length(substring-before($text,$searchString)))

Wenn Sie die Position des ersten Zeichens benötigen NACH die gefundene Zeichenfolge, oder wenn sie nicht vorhanden ist:

contains($text,$searchString)*(1 + string-length(substring-before($text,$searchString)) + string-length($searchString))

Alternativ, wenn Sie die Position des ersten Zeichens benötigen NACH die gefundene Zeichenfolge, oder Länge + 1 wenn sie nicht vorhanden ist:

1 + string-length($right) - string-length(substring-after($right,$searchString))

Das sollte die meisten Fälle abdecken, die Sie benötigen.

Hinweis: Die Multiplikation mit enthält (...) bewirkt, dass das wahre oder falsche Ergebnis der enthält (...) -Funktion in 1 oder 0 konvertiert wird, wodurch elegant der Teil der Logik "0, wenn nicht gefunden" bereitgestellt wird.

9
MrWatson

Ich möchte den Text einer Zeichenfolge auswählen, die sich nach dem Auftreten der Teilzeichenfolge befindet

Du könntest benutzen:

substring-after($string,$match)

Wenn Sie einen Teil der obigen Liste mit einiger Länge wünschen, verwenden Sie:

substring(substring-after($string,$match),1,$length)

Es treten jedoch Probleme auf, wenn die passende Teilzeichenfolge nicht vorkommt. Wenn Sie also eine Teilzeichenfolge mit einer bestimmten Länge nach dem Auftreten einer Teilzeichenfolge oder aus der gesamten Zeichenfolge, wenn keine Übereinstimmung vorliegt, benötigen, können Sie Folgendes verwenden:

substring(substring-after($string,substring-before($string,$match)),
          string-length($match) * contains($string,$match) + 1,
          $length) 
7
user357812

Das folgende Beispiel enthält sowohl XML als auch XSLT, wobei Teilzeichenfolge-vor und Teilzeichenfolge-nach verwendet werden

<?xml version="1.0" encoding="UTF-8"?>
<persons name="Group_SOEM">
    <person>
        <first>Joe Smith</first>
        <last>Joe Smith</last>
        <address>123 Main St, Anycity</address>
    </person>
</persons>    

Das Folgende ist XSLT, das den Wert des Vor-/Nachnamens ändert, indem der Wert durch ein Leerzeichen getrennt wird, sodass das Element first name nach dem Anwenden dieser XSL den Wert "Joe" und das letzte "Smith" hat.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="first">
    <first>
        <xsl:value-of select="substring-before(.,' ')" />
    </first>
</xsl:template> 
<xsl:template match="last">
    <last>
        <xsl:value-of select="substring-after(.,' ')" />
    </last>
</xsl:template> 
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>   
5
Hemant

In XSLT gibt es eine Teilzeichenfolgefunktion. Beispiel hier .

2
Jon