2011-01-29 61 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。查看我的答案以获得完整的解答,解释和示例。 :) – 2011-01-29 17:16:10

回答

2

如果您使用的是XOM,那么您可以使用Saxon针对它运行XPath或XQuery。这使您能够在XPath 2.0中使用大大增加的函数库,其中包括函数lower-case()和upper-case(),还有能力(尽管以某种产品特定的方式)选择自己的排序规则用于与诸如contains()这样的函数一起使用 - 这意味着您可以进行匹配,例如忽略重音以及大小写。

+0

我确实使用了也有正则表达式的Saxon 8,也许我的配置有些问题。我会再检查一次。 – millebii 2011-01-29 19:19:52

2

2.我试过包含(翻译( “ABCEDF ......”, “ABCDEF ......”), “案例insentive字符串”)]” 太失败了。

写这个正确的方法是

/root/book[contains(translate(., $vUpper, $vLower), 
        translate($vCaseInsentiveString, $vUpper, $vLower) 
        ) 
      ] 

其中$vUpper$vLower被定义为(应由取代)的字符串:

'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 

'abcdefghijklmnopqrstuvwxyz' 

$vCaseInsentiveString被定义为(应被替换为)特定的不区分大小写的字符串。

例如,给定下面的XML文档

<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> 

以下XPath表达式(由对应的字符串替代变量):

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

选择该元件

<name>Leo Tolstoy</name> 

说明的函数的两个参数被转换为较低的情况下,然后进行比较。

+0

+1为经典的方法。 – Flack 2011-01-31 08:45:12