web-dev-qa-db-ja.com

XSL部分文字列とindexOf

XSLTは初めてです。アイテムのサブストリングを選択することは可能だろうか。 RSSフィードを解析しようとしています。説明値には、表示したいテキストよりも多くのテキストが含まれています。部分文字列のインデックスに基づいて、そのサブトリングを取得したいと思います。基本的に、indxOf( 'some_substring')と長さをパラメーターとして渡す部分文字列呼び出しの結果を表示します。これは可能ですか?

コメントから

部分文字列の出現後にある文字列のテキストを選択したい

22
Carlos Blanco

部分文字列のインデックスで何をしたいのか明確ではありません[更新:より明確になりました-ありがとう]が、関数_substring-after_または_substring-before_を使用できる場合があります。

_substring-before('My name is Fred', 'Fred')
_

_'My name is '_を返します。

より詳細な制御が必要な場合、substring()関数は、string、starting-index、lengthの2つまたは3つの引数を取ることができます。文字列全体を取得するには、長さを省略します。

XPathの文字列にはindex-of()関数はありません(XPath 2.0にはシーケンスのみ)。位置が特に必要な場合は、string-length(substring-before($string, $substring))+1を使用できます。

contains($string, $substring)もあります。これらはすべて文書化されています here 。 XPath 2.0では、正規表現一致を使用できます。

(XSLTは主に XPath を使用してノードを選択し、値を処理するため、これは実際にはよりXPathの質問です。このようにタグ付けしました。)

46
LarsH

IndexOf($ text、$ searchString)の1つのライナーxpath 1.0式を次に示します。

探している文字列の[〜#〜] first [〜#〜]文字の位置、または存在しない場合は0の位置が必要な場合:

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

最初の文字の位置が必要な場合[〜#〜] after [〜#〜]見つかった文字列、または存在しない場合:

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

あるいは、最初の文字の位置が必要な場合[〜#〜] after [〜#〜]見つかった文字列、またはlength + 1存在しない場合:

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

それはあなたが必要とするほとんどの場合をカバーするはずです。

注:contains(...)による乗算により、contains(...)関数のtrueまたはfalseの結果が1または0に変換されます。これにより、ロジックの「見つからないときは0」部分がエレガントに提供されます。

9
MrWatson

部分文字列の出現後にある文字列のテキストを選択したい

次を使用できます。

substring-after($string,$match)

上記をある程度の長さにしたい場合は、次を使用します。

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

しかし、一致する部分文字列が存在しない場合は問題が始まります...したがって、部分文字列の出現後に特定の長さの部分文字列が必要な場合、または一致しない部分文字列全体から部分文字列を使用する場合は、次を使用できます:

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

以下は、substring-beforeとsubstring-afterが使用されるXMLとXSLTの両方を含む完全な例です

<?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>    

以下はXSLTで、値をスペースで区切って名/姓の値を変更します。これにより、このXSLの適用後、名要素の値が「Joe」と最後の「Smith」になります。

<?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

XSLTにはサブストリング関数があります。例 ここ

2
Jon