我们的用户正在将数据输入到浏览器表单中,包括可能包含不间断空格的文本。当他们将数据保存到服务器时(通过对eXist-db的AJAX请求),它将在HTTP POST有效内容中使用
发送以下内容:
<request type="edit_collection" id="TC0002">
<about>Chômei a donc rédigé un recueil d’anecdotes,
s’intégrant dans le genre de la « littérature
d’anecdotes » (setsuwa bungaku), qui remonte
au début du IXe siècle.</about>
</request>
开始处理HTTP请求的模块首先将有效载荷数据分配给$ content:
let $content := request:get-data()
上面的操作没有错误,因为$content
只是一个字符串,尚未解析为XML。仅当我稍后将$content
传递给XML解析时,才会出现错误,并拒绝
并出现错误:
exerr:ERROR cannot convert xs:string('<request
type="edit_collection" date="TC0002">
<about>Chômei a donc rédigé un recueil d’anecdotes, s’intégrant
dans le genre de la « littérature d’anecdotes » (setsuwa
bungaku), qui remonte au début du IXe siècle.</about>
</request>') to a node set
XML Parsing Error: undefined entity
但是,在解析之前简单替换
是不合法的,即XPATH(在eXist中实现的XQuery中?)在此公式中将不接受
:
let $content := replace(request:get-data()," "," ")
在解析为XML之前,还有其他方法可以替换
吗?
((我的偏好是在服务器端而不是Javascript中进行此清洁)
您显示的代码段不是合法的XML-要形成正确的格式,需要有一个声明实体nbsp
的DTD。因此,目前尚不清楚您是如何处理它的,或者为什么它会达到它的最大效果。
[如果存在DTD,则XQuery处理器看到的内容(由XML解析器提供)将是实体的扩展(大概是单个xA0字符),并且查询无需执行任何操作即可理解或翻译。
也许这里还发生了其他事情:也许您显示的摘录实际上位于CDATA部分中,所以XML解析器将其不变地传递了?
==更新==
您已经说明您实际上正在处理包含六个字符的序列
的字符串,并希望将其替换为单个字符xA0。
概括地说,XPath表达式replace(' ', '_')
(其中'_'是xA0)将执行此操作;问题是如何用具体的语法表达这一点,这取决于宿主语言。这也是XQuery与XPath不完全相同的地方。特别是,XQuery使用XML规则对字符串文字中的特殊字符进行转义(但在其他地方不进行转义),尽管XPath不会进行任何转义或转义,但它依赖于宿主语言来进行此操作。
在XQuery中,我认为正确的表达式是replace('&nbsp;', ' ')
。