首页 > 解决方案 > 在 XQuery 中返回数据($variable)时在各个输出项之间插入空格

问题描述

我已经将一个带有许多不必要<span>标签等的相当混乱的 HMTL 文档转换为 XML 文件,以便能够读取数据。

HTML 文件包含 100 个带有标准化书目信息的项目。

在 XQuery 中使用以下查询...

 for $v in doc("Geburtsbrief1-100.xml")
 return data($v)

...我得到每个项目的输出结构如下:

SIGNATUR:G / 1630 M�rz 20Regest:Pforzheim,1630.03.20Geburtsbrieff�rdenMaurerundSteinmetzHansRuckisservonPforzheim.Aussteller:StadtPforzheim.S.derStadt.Datierung:20.03.1630Formalbeschreibung (bei
Urkunden):Ausfertigung.Perg.Provenienz:StadtMainzPersonenindex:Ruckisser, HansOrtsindex:Pforzheim

我正在使用 BaseX 和 XQuery 3.1 版来运行我的查询。

上面结果字符串中“地点”信息的 XML 结构如下所示:

<tr class="ergebniserfassungzeile" id="org3_9_0">
<th id="org3_9_0F" class="fnam" axis="Feldname">
<div class="ergebniserfassungfeldname">Provenienz:</div>
</th>
<td colspan="2" id="org3_9_0I" axis="Feldinhalt" class="tdfinh">
<div id="div3_9" class="ergebniserfassungfeldinhalt"><a class="h"
title="" href="javascript:h('5%20Stadt')">Stadt</a> <a class="h"
title="" href="javascript:h('5%20Mainz')">Mainz</a></div>
</td>
</tr>

所有其他类型的数据(有关人员的信息、文档的重要性、内容等)具有完全相同的表结构,具有完全相同的标签、属性和属性值,例如“Feldinhalt”。这就是为什么我至少需要捕获完整<tr class="ergebniserfassungzeile">的节点才能理解我得到的结果。

数据方面,完整data($v)完美,不介意德文特殊字符乱码。但我很想看到所有单词之间的空格。由于实际上每个单词都由<span>原始 HTML 中的一个标签构成,因此该输出在技术上是正确的。

有没有办法告诉 XQuery在返回每个文档标记中的数据后添加额外的空格?到目前为止,我发现的所有教程都解释了如何删除空格,但我想做相反的事情。

标签: xmlxquerywhitespace

解决方案


您提供的示例数据包含空格,因此只需选择将输出单词之间的空格,例如https://xqueryfiddle.liberty-development.net/gWmuPs7的结果

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method 'text';

.

Provenienz:


Stadt Mainz

因此,我认为您可能希望确保 BaseX 在解析期间不会切断空白。

至于一般的问题,如果你有一个像data()在单个文档节点上调用的单个字符串会给你,那么插入分隔符没有什么魔力。

另一方面,您可以选择到文本节点级别并插入项目分隔符,或者您可以使用字符串连接,例如

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method 'text';
declare option output:item-separator ' ';

//text()

或者

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method 'text';

string-join(//text(), ' ')

推荐阅读