2012-07-29 82 views
0

背景:我使用HtmlAgilityPack(.Net),所以我不得不使用XPath 1.0,which doesn't have a lower-case implementationXPath表達式中的「代碼重用」

我正在嘗試查找所有包含foo作爲整個單詞的屬性的節點。
例子:

  • 「富」 比賽
  • 「我富」 比賽
  • 「富巴」 比賽
  • 「富」 比賽
  • 「的IFoo 「不匹配
  • 「食物」 不匹配

這是我有什麼(也有XPath 1.0中沒有ends-with ...):

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

this,我可以用這個可怕方法小寫搜索條件:

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

最後,我的問題:如何使用translate函數,同時保持表達儘可能簡短和可讀?

(獎金:我如何不同表情之間共享這個)

+0

你是什麼意思?「我如何在不同的表情之間分享這個」?其餘的Tomalak回答非常好 - 使用定點方法是一種衆所周知的編程技術。 – 2012-07-29 14:34:49

回答

1

只需使用(託默勒格的回答摘要版):

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

警告

切勿插入XPath表達式佔位符由一個未知的代理接收一個字符串(最終用戶) 。這爲XPath Injection attack打開了一個大洞。

的recomended做法是有一個編譯的XPath表達式和傳遞(在XPath表達式或get them via a variable or function reference)用戶提供的字符串作爲參數時評價完成。

+0

感謝 - 現在好多了......而且我使用了一個常量,所以我不擔心打針(雖然不是'foo')。 – seldary 2012-07-30 04:48:26

+0

@seldary:不客氣。我真的建議在上下文中使用編譯的XPath表達式+函數/變量。 – 2012-07-30 04:57:54