XPATH(eXistdb)如何替换HTTP请求内容中的文字

问题描述 投票:0回答:1

我们的用户正在将数据输入到浏览器表单中,包括可能包含不间断空格的文本。当他们将数据保存到服务器时(通过对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 «&nbsp;littérature 
   d’anecdotes&nbsp;» (setsuwa bungaku), qui remonte 
   au début du IXe siècle.</about> 
</request>

开始处理HTTP请求的模块首先将有效载荷数据分配给$ content:

let $content := request:get-data()

上面的操作没有错误,因为$content只是一个字符串,尚未解析为XML。仅当我稍后将$content传递给XML解析时,才会出现错误,并拒绝&nbsp;并出现错误:

exerr:ERROR cannot convert xs:string('&lt;request 
type=&quot;edit_collection&quot; date=&quot;TC0002&quot;&gt;
&lt;about&gt;Chômei a donc rédigé un recueil d’anecdotes, s’intégrant 
dans le genre de la «&nbsp;littérature d’anecdotes&nbsp;» (setsuwa 
bungaku), qui remonte au début du IXe siècle.&lt;/about&gt; 
&lt;/request&gt;') to a node set 

XML Parsing Error: undefined entity

但是,在解析之前简单替换&nbsp;是不合法的,即XPATH(在eXist中实现的XQuery中?)在此公式中将不接受&nbsp;

let $content := replace(request:get-data(),"&nbsp;","&#160;")

在解析为XML之前,还有其他方法可以替换&nbsp;吗?

((我的偏好是在服务器端而不是Javascript中进行此清洁)

xpath xquery exist-db
1个回答
0
投票

您显示的代码段不是合法的XML-要形成正确的格式,需要有一个声明实体nbsp的DTD。因此,目前尚不清楚您是如何处理它的,或者为什么它会达到它的最大效果。

[如果存在DTD,则XQuery处理器看到的内容(由XML解析器提供)将是实体的扩展(大概是单个xA0字符),并且查询无需执行任何操作即可理解或翻译。

也许这里还发生了其他事情:也许您显示的摘录实际上位于CDATA部分中,所以XML解析器将其不变地传递了?

==更新==

您已经说明您实际上正在处理包含六个字符的序列&nbsp;的字符串,并希望将其替换为单个字符xA0。

概括地说,XPath表达式replace('&nbsp;', '_')(其中'_'是xA0)将执行此操作;问题是如何用具体的语法表达这一点,这取决于宿主语言。这也是XQuery与XPath不完全相同的地方。特别是,XQuery使用XML规则对字符串文字中的特殊字符进行转义(但在其他地方不进行转义),尽管XPath不会进行任何转义或转义,但它依赖于宿主语言来进行此操作。

在XQuery中,我认为正确的表达式是replace('&amp;nbsp;', '&#xa0;')

© www.soinside.com 2019 - 2024. All rights reserved.