_xsl 1.0
_を使用して文字列値から次の文字を削除する必要があります
*, /, \, #, %, !, @, $, (, ), &
私は次のことを考え出しました:
_translate(translate(translate(string(//xpath/@value),'.',''),'/',''),',','')
_
上記のアプローチでは、同じコードを何度も(文字ごとに1回)複製する必要があります。
コードを複製せずに同じ目標を達成するにはどうすればよいですか?
ありがとう:-)
アンパサンドtranslate(//foo/@value, '*\%!@$&', '')
をエスケープする必要があるXSLTスタイルシートのように、XMLドキュメント内の純粋なXPathにそれぞれ<xsl:value-of select="translate(//foo/@value, '*\%!@$&', '')"/>
が必要です。
translate()
関数は、2番目と3番目の引数として2つのstrings-2つの文字だけではないを受け入れます。
_translate(., $string1, '')
_
_$string1
_にある文字の出現が削除されたコンテキスト(現在の)ノードの文字列値である文字列を生成します。
したがって、使用できます:
_translate(expressionSelectingNode, "/\#%!@$()&", "")
_
2番目の引数に含まれる文字を削除するには。
もちろん、translate()
関数がXSLTスタイルシート内(または一般にXMLドキュメント内)で使用される場合、_<
_や_&
_などの一部の特殊文字はそれぞれエスケープする必要があります_<
_および_&
_として。
これは非常に強力なので、unknown文字のセットを削除できます:
数字以外のすべての文字を文字列から削除するとします。文字列にどのような文字が含まれるかは事前にわからないため、translate()
の2番目の引数でそれらを列挙することはできません。ただし、このような不明な文字はすべて削除できます。
_translate(., translate(., '0123456789', ''), '')
_
内側のtranslate()
は、数字以外の文字列を生成します。
外側のtranslate()
は、この内部のすべての非数字文字(内側のtranslate()
によって検出された)を元の文字列から削除します。したがって、残るのは数字文字だけです。