我的旧数据库中有一个内容既不是有效的HTML,也不是XML。考虑到这一事实,清理遗留文件会很困难,我想在MarkLogic中使用xdmp:tidy进行清理。我目前使用的是ML-8。
<sub>
<p>
<???†?>
</p>
</sub>在某种程度上,我将此内容传递给了整洁的功能:
declare variable $xml as node() :=
<content>
<![CDATA[<p><???†?></p>]]>
</content>;
xdmp:tidy(xdmp:quote($xml//text()),
<options xmlns="xdmp:tidy">
<assume-xml-procins>yes</assume-xml-procins>
<quiet>yes</quiet>
<tidy-mark>no</tidy-mark>
<enclose-text>yes</enclose-text>
<indent>yes</indent>
</options>)因此,它返回:
<p>
<? ?†?>
</p>现在这个结果不是有效的xml格式(我是通过XML validator检查的),因为当我试图将这个XML插入到MarkLogic中时,它会抛出一个错误,说‘主体格式错误|处理指令名无效’。
我对PI做了一些调查,但运气不是很好。我可以尝试在没有PI的情况下保存内容,但这也不是有效的PI。
发布于 2016-01-08 17:25:39
这是因为你认为是PI的东西实际上不是PI。来自W3C:
2.6处理指令
定义:处理指令( Processing instructions,PI)允许文档包含应用程序的指令。
处理指令
16 PI ::= '‘Char*))?'?>’
17 PITarget ::= Name - (('X‘| 'x') ('M’| 'm') ('L‘|’l‘)
所以PI名称不能以开头?正如您的示例??†一样,您可能希望在将内容传递给†之前将其清理干净。如下所示:
declare variable $xml as node() :=
<content><![CDATA[<p>Hello <???†?>world</p>]]></content>;
declare function local:copy($input as item()*) as item()* {
for $node in $input
return
typeswitch($node)
case text()
return fn:replace($node,"<\?[^>]+\?>","")
case element()
return
element {name($node)} {
(: output each attribute in this element :)
for $att in $node/@*
return
attribute {name($att)} {$att}
,
(: output all the sub-elements of this element recursively :)
for $child in $node
return local:copy($child/node())
}
(: otherwise pass it through. Used for text(), comments, and PIs :)
default return $node
};
xdmp:tidy(local:copy($xml),
<options xmlns="xdmp:tidy">
<assume-xml-procins>no</assume-xml-procins>
<quiet>yes</quiet>
<tidy-mark>no</tidy-mark>
<enclose-text>yes</enclose-text>
<indent>yes</indent>
</options>)这样做可以消除所有PI(真实和虚假PI)
致以敬意,
彼得
https://stackoverflow.com/questions/34671409
复制相似问题