【问题标题】:Ignoring case matching in XQuery忽略 XQuery 中的大小写匹配
【发布时间】:2010-12-29 19:13:02
【问题描述】:

我最初编写了一个简单的 XQuery 脚本:

$mediaNodes := doc('/db/portfolio/media_data_101109.xml'),
$query := concat('$mediaNodes//media[contains(@product,"',$product,'")'

基本上,它的作用是首先检索媒体记录的 xml 文件。然后我建立了一个查询,搜索所有 mediaNodes(xml 文件的元素),并将@product 属性与用户在浏览器中提供的内容相匹配,我使用了包含,所以不需要精确匹配。

现在我想稍微扩展一下,也就是忽略大小写。所以无论用户在浏览器中输入什么大小写,我都会将其转换为小写,我也会将节点文本转换为小写。

我在网上搜索,发现函数小写,并相应地更改了我的代码:

$query := concat('$mediaNodes//media[contains(lower-case(@product),"',lower-case($product),'")',

但这不起作用,如果我执行查询,就会出现堆溢出。使用 product=wborc 运行后得到的查询如下所示:

$mediaNodes//media[contains(lower-case(@product),"wborc")]

有人可以帮帮我吗?我不确定我是在犯语法错误还是逻辑错误。提前致谢。

【问题讨论】:

  • 您的问题很不清楚: 1. 您要查询的 XML 文档是什么(请尽量减少)。 2. 这个 XML 文档的期望结果究竟是什么? 3.期望的结果是什么意思?
  • 好问题,+1。请参阅我的答案以获得完整的解决方案。 :)
  • 有一些小的调整 - 请参阅我最新更新的答案。
  • 看起来您正在构建一个假设为 XQuery 表达式的字符串,可能用于第二步查询或非标准动态评估。这两种解决方案似乎都是一个糟糕的设计选择,主要是因为这是一个非常简单的查询......
  • @Alejandro:确切地说,这是针对 eXist db 上的 XQuery 表达式,实际上它总是使我的查询网页崩溃和堆溢出。到目前为止不知道为什么。

标签: xml xpath xquery


【解决方案1】:

使用

concat('$vmediaNodes//media
        [contains(lower-case(@product),','lower-case("',$vProduct,'"))]')

【讨论】:

  • @Robert:你可以使用任何你想要的变量名。我有我的约定——为了能够一目了然地区分变量名和元素名(以防我不小心错过了开头的$ 字符),我总是有以“v”开头的变量名,参数名以“p”开头,键名以“k”开头。
  • 知道了。干杯。让我困惑的一件事是,在 eXist db 上运行它时,查询页面总是变成无响应,最后变成堆溢出。
  • @Robert:这是 eXist 的问题——它取决于实现。我可以给你 XSLT 代码,它可以毫无问题地执行这个表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多