如何使用xQuery解码转义的XML

9

我有一个xQuery变量,类型为xs:string,其值为编码的HTML片段(Twitter推文的内容)。它看起来像这样:

Headlines-Today • AP sources: <b>Obama</b> pick for Justice post withdraws : News - Rest Of World - <a href="http://shar.es/mqMAG">http://shar.es/mqMAG</a>

当我尝试将其写入HTML块时,我需要字符串未转义,以便浏览器解释HTML片段。但实际上字符串被原样写出,浏览器将其呈现为纯文本(因此您会看到<a href="blah....)。以下是我如何写出此字符串的方式:

{$entry/atom:content/text()}

如何使转义字符不再编码,所以它写入<而不是&lt;?

我尝试过进行替换,但它总是将&lt;替换为&lt;!

fn:replace($s, "&lt;", "<")

4个回答

3
在 eXist 中,使用 util:parse() 函数进行解析:
util:parse(concat("<top>","&lt;c&gt;asdf&lt;/c&gt;",</top>")‌​)

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - Yaroslav
1
正如它所表现的那样 :-( - eXist库util有一个函数parse,可以解析一个字符串,前提是该字符串是格式正确的XML。除非知道该字符串有一个单一的根元素,否则最好添加一个顶级元素: util:parse(concat("<top>","<c>asdf</c>",</top>")) - Chris Wallace
最好将您的评论添加到答案中,编辑并添加所需内容。 - Yaroslav
至少对于 eXist-db v4 或更早版本,这是正确的。在 eXist-db 5 中,该函数已被标准 Query 3 函数所取代,请参见下面的答案 https://dev59.com/HU3Sa4cB1Zd3GeqPsRcI#70844757。 - Benjamin W. Bohl

3
在 MarkLogic 中,您可以使用以下查询:
let $d := '<a>&lt;c&gt;asdf&lt;/c&gt;</a>' 

return xdmp:unquote ($d)

2

取决于您使用的 XQuery 处理器... 最简单的方法是使用一个具有处理此操作的扩展程序的处理器。例如,使用 Saxon 和以下 XML

<a>&lt;c&gt;asdf&lt;/c&gt;</a>

您可以编写一个使用 saxon:parse() 函数的XQuery来实现您想要的功能:
declare namespace saxon = "http://saxon.sf.net/";

<a>{
  saxon:parse(doc('test.xml')/a)
}</a>

那样做的结果是:
<a>
  <c>asdf</c>
</a>

我认为大多数 XQuery 处理器都会有一个扩展来帮助您完成此操作。希望这有所帮助。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接