2012-01-23 1 views
5

XML文書から特定のノードを選択するのにXPATHを使用しています。XPath lower-case()関数

ユーザーは、場所の値を挿入できます。それは正常に動作していますが、異なるケースが使用されている場合は動作しません。

XML値とユーザーの入力を比較する前に小文字に変更することが、おそらくこれを実行する最良の方法だと私は判断しました。

私は、現時点では私のセレクタとしてこれを持っている:

NodeIter = nav.Select("/Houses/House/location[contains(../location, '" + location_input + "')]"); 

私は様々な場所にlower-case()機能を入れて試してみたが、それはそれで満足していないです。

../locationの値を小文字として比較するにはどうすればよいですか?

注:location_inputは、C#コード内でToLower()を使用して低く設定されています。

+1

「それは幸せではない」とはどういう意味ですか? – BoltClock

答えて

17

lower-case()関数は、XPath 2.0以降でのみサポートされています。ご使用の環境が標準のこのバージョンをサポートしている場合は、書くことができます。

NodeIter = nav.Select("/Houses/House/location[contains(lower-case(.), '" 
    + location_input + "')]"); 

をしかし、チャンスはあなたは、XPath 1.0で立ち往生しています。その場合、あなたはtranslate()機能乱用することができます、厳密にケースはケース盲検比較を行うには正しい方法ではありません(または上)下げるために2つの文字列を翻訳し、話す

NodeIter = nav.Select("/Houses/House/location[contains(translate(., " 
    + "'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '" 
    + location_input + "')]"); 
4

translate(../location, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')あなただけのAZ

2

lower-casehttp://www.w3.org/TR/xpath-functions/#func-lower-caseに逃げることができる場合は、そう、あなたが2.0またはXQuery 1.0実装XQSharpようやサクソン9の.NETバージョンのようなXPathを使用する必要があるのXPath 2.0とXQuery 1.0の一部であり、そのような機能を使用したい場合。

XPath 1.0ではすべてNodeIter = nav.Select(string.Format("/Houses/House/location[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXZY', 'abcdefghijklmnopqrstuvwxyz'), '{0}')]", location_input));です。

2

注意のマッピング理由Unicodeの小文字から大文字までの文字は、1対1ではありません。原則として、XPath 2.0では大文字と小文字の区別を使用する必要があります。残念ながら、多くのXSLT 2.0とXQuery 1.0プロセッサでは大文字小文字の照合を使用できますが、照合URIの標準は存在しないため、コードはプロセッサに依存します。

0

私はVS2017を使用して同じジレンマを持っていた(NetFramework 4.6.1)、XPath2 NuGetパッケージをインストールしました。これまでは、XPath2関数を使用するときにうまく機能しました。

関連する問題