XPath の文字列比較で、小文字と大文字を区別しない方法

2010/01/29
★★
.NET の XML DOM を使って、XPath の文字列比較によって、大文字、小文字を区別することなく、ノードをセレクトする方法を紹介する。
一般的な言語系であれば、文字列比較関数で、大文字、小文字を区別することなく、文字列を一致させるオプションが用意されていることは普通だ。しかし、XPath では、そのような関数のオプションは用意されていないようだ。
translate() 関数を応用することによって実現する。

まず、translate() 関数によって、検索対象ノード値文字列を小文字に変換する。
これは、string クラスの ToLowerString() メソッドに相当する。

translate(@targetAttribute, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')

あとは、通常の文字列比較によって、式を記述する。
以下は、object ノードより、deleted 属性が、false のノードのみを取得するサンプルコード。deleted 属性文字列は、大文字、小文字を区別しない。

System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
xml.LoadXml("<root><object deleted="false" /><object deleted="False" /><object deleted="true" /><object deleted="FALSE" /></root>");
System.Xml.XmlNodeList enableObjectNodes = xml.SelectNodes("root/object[translate(@deleted, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='false']");