1

我的旧数据库中的内容既不是有效的 HTML 也不是 XML。考虑到清理遗留问题很困难,我想在 MarkLogic 中使用 xdmp:tidy 进行整理。我目前正在使用 ML-8。

<sub>
   <p>
      <???&dagger;?>
   </p>
</sub>

我以某种方式将此内容传递给整洁的功能:

declare variable $xml as node() := 
       <content>
           <![CDATA[<p><???&dagger;?></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>
<?  ?&dagger;?>
</p>

现在这个结果不是有效的 xml 格式(我通过 XML 验证器检查了它),因此当我尝试将此 XML 插入 MarkLogic 时,它会抛出一个错误,提示“MALFORMED BODY | 无效的处理指令名称。

我对 PI 进行了一些调查,但运气不佳。我本可以尝试在没有 PI 的情况下保存内容,但这也不是有效的 PI。

4

1 回答 1

6

那是因为你认为的 PI 实际上不是 PI。来自 W3C:

2.6 处理指令

[定义:处理指令 (PI) 允许文档包含应用程序指令。]

处理指令

[16] PI ::= '' 字符*)))?'?>'

[17] PITarget ::= 名称 - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

所以 PI 名称不能以 ? 就像您的示例一样??†您可能希望在将内容传递给 tidy 之前对其进行清理。如下所示:

declare variable $xml as node() := 
   <content><![CDATA[<p>Hello <???&dagger;?>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)

问候,

彼得

于 2016-01-08T09:25:38.883 回答