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()
对我不起作用,它导致 <br />
被显示,< >
肯定会被转义。)
如上所述,我尝试了一些语法,但总是收到错误消息。这是我所做的:
测试 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/>
导致:
意外标记:
>
(同时期望元素的结束标记 构造函数:div)
【问题讨论】:
请始终描述您尝试过的什么以及失败的原因,以及预期的输出究竟是什么。并查看如何正确格式化您的问题(在FAQ),使其更易于阅读(尤其是:代码格式化和枚举)。 更正了枚举。但是代码格式有什么问题? 问题现在看起来很棒。最好始终使用代码周围的反引号来应用内联代码格式,尤其是在任何可能被解释为 HTML 或 markdown 的情况下。我刚刚添加了一些。 【参考方案1】:您基本上想要的是一个项目序列。在 XML 中,一个元素始终只有一个根节点。例如,关于你的段落,<p>something</p>
是一个元素,而你想要的输出 something<br/>
是一个项目序列,在这种情况下是一个字符串和一个元素。
在 XQuery 中,序列只是用括号括起来,例如('s', <a/>, 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 标记的主要内容,如果未能解决你的问题,请参考以下文章