使用XOM的具有不区分大小写内容的节点

时间:2011-01-29 15:16:32

标签: xpath xom

我想从XOM文档中查询包含特定值但不区分大小写的节点。像这样:

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

包含区分大小写。

  1. 我试图使用正则表达式,但确实如此 只有XPATH2.0和XOM似乎没有 支持它。
  2. 我试过了 contains(translate(."ABCEDF...","abcdef..."),"case-insentive-string")]' 也失败了。
  3. 我试着匹配 子节点和读取父属性 使用getParent,但没有 阅读父母属性的方法。
  4. 有什么建议吗?

2 个答案:

答案 0 :(得分:2)

  

2.我试过包含(翻译(。“ABCEDF ...”,“abcdef ...”),“case-insentive-string”)]'   也失败了。

写这个的正确方法是

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

解释 contains()函数的两个参数都转换为小写,然后执行比较。

答案 1 :(得分:2)

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