web-dev-qa-db-ja.com

xslを使用して文字を削除する

_xsl 1.0_を使用して文字列値から次の文字を削除する必要があります

*, /, \, #, %, !, @, $, (, ), &

私は次のことを考え出しました:

_translate(translate(translate(string(//xpath/@value),'.',''),'/',''),',','')
_

上記のアプローチでは、同じコードを何度も(文字ごとに1回)複製する必要があります。

コードを複製せずに同じ目標を達成するにはどうすればよいですか?

ありがとう:-)

17

アンパサンドtranslate(//foo/@value, '*\%!@$&', '')をエスケープする必要があるXSLTスタイルシートのように、XMLドキュメント内の純粋なXPathにそれぞれ<xsl:value-of select="translate(//foo/@value, '*\%!@$&amp;', '')"/>が必要です。

17
Martin Honnen

translate()関数は、2番目と3番目の引数として2つのstrings-2つの文字だけではないを受け入れます。

_translate(., $string1, '')
_

_$string1_にある文字の出現が削除されたコンテキスト(現在の)ノードの文字列値である文字列を生成します。

したがって、使用できます

_translate(expressionSelectingNode, "/\#%!@$()&", "")
_

2番目の引数に含まれる文字を削除するには

もちろん、translate()関数がXSLTスタイルシート内(または一般にXMLドキュメント内)で使用される場合、_<_や_&_などの一部の特殊文字はそれぞれエスケープする必要があります_&lt;_および_&amp;_として。

これは非常に強力なので、unknown文字のセットを削除できます

数字以外のすべての文字を文字列から削除するとします。文字列にどのような文字が含まれるかは事前にわからないため、translate()の2番目の引数でそれらを列挙することはできません。ただし、このような不明な文字はすべて削除できます。

_translate(., translate(., '0123456789', ''), '')
_

内側のtranslate()は、数字以外の文字列を生成します。

外側のtranslate()は、この内部のすべての非数字文字(内側のtranslate()によって検出された)を元の文字列から削除します。したがって、残るのは数字文字だけです。

23