2

我想从包含特定值但不区分大小写的 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 回答 2

2

2.我试过 contains(translate(."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()都转换为小写,然后进行比较。

于 2011-01-29T17:15:24.923 回答
2

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

于 2011-01-29T18:23:13.290 回答