首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何整理Marklogic中的处理指令

如何整理Marklogic中的处理指令
EN

Stack Overflow用户
提问于 2016-01-08 15:15:16
回答 1查看 201关注 0票数 1

我的旧数据库中有一个内容既不是有效的HTML,也不是XML。考虑到这一事实,清理遗留文件会很困难,我想在MarkLogic中使用xdmp:tidy进行清理。我目前使用的是ML-8。

代码语言:javascript
复制
<sub>
   <p>
      <???&dagger;?>
   </p>
</sub>

在某种程度上,我将此内容传递给了整洁的功能:

代码语言:javascript
复制
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>)

因此,它返回:

代码语言:javascript
复制
<p>
<?  ?&dagger;?>
</p>

现在这个结果不是有效的xml格式(我是通过XML validator检查的),因为当我试图将这个XML插入到MarkLogic中时,它会抛出一个错误,说‘主体格式错误|处理指令名无效’。

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

EN

回答 1

Stack Overflow用户

发布于 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名称不能以开头?正如您的示例??†一样,您可能希望在将内容传递给†之前将其清理干净。如下所示:

代码语言:javascript
复制
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)

致以敬意,

彼得

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34671409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档