2017-01-13 13 views

答えて

1

は、文字列内の特定の文字の出現回数をカウントする1つの方法は、他のすべてを削除することです文字列長を使用します。 XPath 2.0では、string-length(replace($str, '[^;]+', ''))を使用することができますが、はセミコロンではないすべての文字を返します。translate($str, translate($str, ';', ''), '')はセミコロンだけの文字列を返します。string-length(translate($str, translate($str, ';', ''), '')を使用して文字を数えます。

+0

助けてくれてありがとう。非常に有用です...ありがとう – Mak2081993

+0

XPathのような重いツールの場合、1つまたは2つの簡単なbashビルドインで十分でしょうか? –

+0

@D.Kovács、ポスターはxsltという質問をタグ付けしていたので、XSLTで使用されている式言語と同じXPathが適切なツールに見えます。 –

0

echo "my;test;string;it;is" | sed 's/[^;]//g' | wc -cは、カウントのためのトリックを行う必要があります。

echo "my;test;string;it;is" | tr ';' '\n'は、あなたが興味を持っていた場合

+0

この質問は 'xslt'とタグ付けされています。あなたの答えはどの言語ですか? –

+0

@ michael.hor257k確かに、私の悪い、それは金曜日の夜です。私はまだそれを参考にしておきます。コミュニティが望むなら、私はそれを削除します。 –

0

は(前の回答で述べた)string-lengthの使用は十分だろう分割(スプリット文字の選択と\nを置き換える)のためにトリックを行う必要があります文字のカウントの発生でのみ文字列で

この文字列を分割する場合は、tokenizeの機能を使用する必要があります。 タスクの2番目の部分を実行します - 与えられたトークンを使用して文字列を分割します。この場合は​​3210です。

「;」の出現回数は、 (あなたの仕事の第1部) から結果配列(count関数)の要素の数から1を引いた数を得ることができます。ご入力の場合

は、適切なXMLサンプルに変換:

<root> 
    <entry>TELEPHON;EMERGENC;FAX62TC;BS21;BS22;BS23;BS24;BS25;BS26</entry> 
</root> 

は結果を証明するために、次のXSLTを実行します。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/root/entry"> 
    <xsl:text>Entry: </xsl:text> 
    <xsl:value-of select="."/> 
    <xsl:text>&#xa;</xsl:text> 

    <!-- Split the string --> 
    <xsl:variable name="tbl" select="tokenize(., ';')"/> 
    <!-- # of semicolons --> 
    <xsl:variable name="cnt" select="count($tbl) - 1"/> 
    <xsl:text># of ';': </xsl:text> 
    <xsl:value-of select="$cnt"/> 
    <xsl:text>&#xa;</xsl:text> 

    <!-- Show each substring --> 
    <xsl:for-each select="$tbl"> 
     <xsl:value-of select="position()"/> 
     <xsl:text>. </xsl:text> 
     <xsl:value-of select="."/> 
     <xsl:text>&#xa;</xsl:text> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
関連する問題