【问题标题】:XQuery and empty HTML tagsXQuery 和空 HTML 标记
【发布时间】:2014-09-19 09:33:52
【问题描述】:

我正在学习 XQuery,并尝试了一个中等复杂的示例。查询本身有效,但我未能按照我想要的方式添加 HTML。

以下示例有效(在 eXist-db XQuery 引擎中)

for $current_value in $another_variable//some_tag/@attribute
return 
    <div><h1>{$current_value}</h1>
    {
    for $current_sub_value in $another_variable//some_tag
    where $current_sub_value/@attribute = $current_value
    return <p> { data($current_sub_value/@another_attribute) } </p>
    }
    </div>

其实

  • 我想摆脱包装 div。
  • 而不是新的 每个子结果的段落(p ... /p)我只想有一个 每个结果后的换行符 (br)。

所以,预期的结果是这样的:

<h1> ... some text here ... </h1>
some text here ... <br />
another line here ... <br />

但是,无论我尝试过什么,我总是遇到语法错误。

似乎可以在带有{ ... } 的封闭XML 标记中声明XQuery。但是,如果 XML 标记不在 XQuery 周围,而是在 XQuery 之前或之后,我该怎么办?

有没有办法告诉 XQuery 引擎:这里有一点 XQuery 和一些 HTML,只是将它们连接在一起? (XPath 函数 concat() 对我不起作用,它导致 &lt;br /&gt; 被显示,&lt; &gt; 肯定会被转义。)

如上所述,我尝试了一些语法,但总是收到错误消息。这是我所做的:

测试 1/3

for $current_value in $another_variable//some_tag/@attribute
return 
    <h1>{$current_value}</h1>
    {
    for $current_sub_value in $another_variable//some_tag
    where $current_sub_value/@attribute = $current_value
    return <p> { data($current_sub_value/@another_attribute) } </p>
    }

导致:

执行表达式时发现错误: org.exist.xquery.XPathException: err:XPST0003 意外令牌:{ [at 第 4 行,第 5 列]

测试 2/3

for $current_value in $another_variable//some_tag/@attribute
{
return 
    <h1>{$current_value}</h1>
    for $current_sub_value in $another_variable//some_tag
    where $current_sub_value/@attribute = $current_value
    return <p> { data($current_sub_value/@another_attribute) } </p>
}

导致:

执行表达式时发现错误: org.exist.xquery.XPathException: err:XPST0003 意外令牌:{ [at 第 2 行,第 1 列]

测试 3/3

for $current_value in $another_variable//some_tag/@attribute
return
    <div>
    <h1>{$current_value}</h1>
    {
    for $current_sub_value in $another_variable//some_tag
    where $current_sub_value/@attribute = $current_value
    return data($current_sub_value/@another_attribute) <br/>
    }

导致:

意外标记:&gt;(同时期望元素的结束标记 构造函数:div)

【问题讨论】:

  • 请始终描述您尝试过的什么以及失败的原因,以及预期的输出究竟是什么。并查看如何正确格式化您的问题(在FAQ),使其更易于阅读(尤其是:代码格式化和枚举)。
  • 更正了枚举。但是代码格式有什么问题?
  • 问题现在看起来很棒。最好始终使用代码周围的反引号来应用内联代码格式,尤其是在任何可能被解释为 HTML 或 markdown 的情况下。我刚刚添加了一些。

标签: html xquery exist-db


【解决方案1】:

您基本上想要的是一个项目序列。在 XML 中,一个元素始终只有一个根节点。例如,关于你的段落,&lt;p&gt;something&lt;/p&gt; 是一个元素,而你想要的输出 something&lt;br/&gt; 是一个项目序列,在这种情况下是一个字符串和一个元素。

在 XQuery 中,序列只是用括号括起来,例如('s', &lt;a/&gt;, 45) 是一个序列。

所以在你的情况下,以下应该按预期工作:

for $current_value in $another_variable//some_tag/@attribute
return (
  <h1>{$current_value}</h1>,
  for $current_sub_value in $another_variable//some_tag
  where $current_sub_value/@attribute = $current_value
  return (data($current_sub_value/@another_attribute), <br />)
)

【讨论】:

    【解决方案2】:

    dirkk 在解释序列与混合节点方面做得非常出色。了解它们的区别以及在何处使用它们将使您走得更远。

    eXist-DB 的另一个方面是优化。为使内部优化器正常工作,最好避免使用 WHERE 短语,而是使用谓词。

    以上面dirkk的解决方案为例,修改WHERE使用谓词:

    for $current_value in $another_variable//some_tag/@attribute
    return (
      <h1>{$current_value}</h1>,
      for $current_sub_value in $another_variable//some_tag[@attribute = $current_value]
      return (data($current_sub_value/@another_attribute), <br />)
    )
    

    索引是提高性能的另一个关键。但是,最好开始使用谓词来处理 WHERE 上的条件。有关此主题的更多信息,请访问:http://exist-db.org/exist/apps/doc/tuning.xml

    希望这会有所帮助。

    【讨论】:

    • 谢谢!,不知道。但我认为,出于学习的目的,在进行优化之前先习惯语法和典型元素(如 WHERE)是一个好主意。所以,我稍后再看……
    • 我认为谓词,即[ ] 位是典型的语法元素,就像WHERE 一样;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多