2011-01-29 2 views
2

特定の値を含むが大文字と小文字を区別しないXOMドキュメントからノードを照会したい。このような何か:XOMを使用して大文字と小文字を区別しないコンテンツを持つノード

doc.query('/root/book[contains(.,"case-insentive-string")]') 

しかし、それ含まは大文字と小文字が区別されます。

  1. 私は正規表現を使用しようとしましたが、それは のみXPATH2.0とXOMはそれをサポートするために をいないようです。
  2. 試しました contains(translate(."ABCEDF...","abcdef..."),"case-insentive-string")]' も失敗しました。
  3. 私は サブノードと一致させようとしましたが、getParentを使用して親属性 を読み込みましたが、親属性を読み取る方法はありません。

+0

良い質問、+1。完全な解決、説明、および例については私の答えを見てください。 :)古典的な方法のために –

答えて

2

XOMを使用している場合は、Saxonを使用してXPathまたはXQueryを実行できます。これにより、大文字小文字(大文字小文字)と大文字小文字(小文字)を含むXPath 2.0と、独自の照合順序を選択する機能(多少は製品固有の方法である)が大幅に強化された関数ライブラリを使用できるようになりますcontains()などの関数で使用することができます。つまり、アクセントや大文字小文字を無視するなどのマッチングを行うことができます。

+0

Saxon 8も正規表現を使用していますが、私の設定に何か問題があります。私は再び確認します。 – millebii

+0

実際、私は次のエラーを受け取ります: '原因:org.jaxen.UnresolvableException:そのような関数は小文字ではありません。どのようにサクソンと呼ばれるのですか? – millebii

+0

+1適切なUNICODE処理は照合を意味します。 –

2

2.Iが含まれてみました((翻訳します。 "ABCEDF ..."、 "ABCDEF ...")、 "ケース・insentive文字列")]」 はあまりにも失敗しました。

これを記述する適切な方法はある:

$vUpper$vLowerが(で置換されていなければならない)文字列として定義される
/root/book[contains(translate(., $vUpper, $vLower), 
        translate($vCaseInsentiveString, $vUpper, $vLower) 
        ) 
      ] 

'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 

'abcdefghijklmnopqrstuvwxyz' 

および$vCaseInsentiveStringは、特定の大文字と小文字を区別しない文字列として定義されます(置き換えられる必要があります)。例えば

、次のXML文書与えられる:(対応する文字列によって変数を置換)以下のXPath式

<authors> 
    <author> 
    <name>Victor Hugo &amp; Co.</name> 
    <nationality>French</nationality> 
    </author> 
    <author period="classical" category="children"> 
    <name>J.K.Rollings</name> 
    <nationality>British</nationality> 
    </author> 
    <author period="classical"> 
    <name>Sophocles</name> 
    <nationality>Greek</nationality> 
    </author> 
    <author> 
    <name>Leo Tolstoy</name> 
    <nationality>Russian</nationality> 
    </author> 
    <author> 
    <name>Alexander Pushkin</name> 
    <nationality>Russian</nationality> 
    </author> 
    <author period="classical"> 
    <name>Plato</name> 
    <nationality>Greek</nationality> 
    </author> 
</authors> 

を:

/*/author/name 
       [contains(translate(., $vUpper, $vLower), 
         translate('lEo', $vUpper, $vLower) 
         ) 
       ] 

この要素を選択:

<name>Leo Tolstoy</name> 

説明:関数の両方引数は小文字に変換され、その後、比較が行われます。

+0

+1。 – Flack

関連する問題