XQuery 和空 HTML 标记

Posted

技术标签:

【中文标题】XQuery 和空 HTML 标记【英文标题】:XQuery and empty HTML tags 【发布时间】: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 的情况下。我刚刚添加了一些。 【参考方案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 一样;-)

以上是关于XQuery 和空 HTML 标记的主要内容,如果未能解决你的问题,请参考以下文章

如何将XQuery表达式标记为确定性? (为了保留来自XML值的计算列)

xquery结果怎么保留标签之间的换行符

了解HTML和Css样式

three.js 中挤出形状的奇怪工件和空纹理

常用的HTML标记(一)

HTML---图像标记和表格标记