0

背景:HtmlAgilityPack(.Net)を使用しているため、小文字の実装がないXPath1.0を使用する必要があります。

foo単語全体を含む属性を持つすべてのノードを見つけようとしています。
例:

  • 「foo」マッチ
  • 「私のfoo」の一致
  • 「foobar」の一致
  • 「フー」マッチ
  • 「ifoo」は一致しません
  • 「食べ物」は一致しません

ends-withこれは私が持っているものです( XPath 1.0に もありません...):

//*[@*[starts-with(.,'foo ') or contains(.,' foo ') or .='foo' or substring(.,string-length(.) - 3)=' foo']]

これによると、この恐ろしい方法を使用して、検索条件を小文字にすることができます。

translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')

最後に、私の質問:式をできるだけ短く、読みやすくしながら、関数を使用するにはどうすればよいですか?translate

(ボーナス:異なる表現間でこれを共有するにはどうすればよいですか?)

4

2 に答える 2

1

XPathにカスタム関数を追加するのはどうですか?

于 2012-07-29T14:29:08.200 に答える
1

使用するだけです(Tomalakの回答の要約版):

//@*[contains(concat(' ', 
                     translate(normalize-space(), 'FOO', 'foo'), 
                     ' '), 
              ' foo '
              )
    ]

警告

不明なエージェント(エンドユーザー)が受け取った文字列をXPath式プレースホルダーに挿入しないでください。これにより、XPathインジェクション攻撃のギャップが広がります。

推奨される方法は、コンパイルされたXPath式を用意し、評価が行われたときにユーザー指定の文字列をパラメーターとして渡す(または、XPath式の変数または関数参照を介して取得する)ことです。

于 2012-07-29T16:07:15.020 に答える