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

Xquery 如何整理Marklogic中的处理指令,xquery,marklogic,tidy,htmltidy,marklogic-8,Xquery,Marklogic,Tidy,Htmltidy,Marklogic 8,我的旧数据库中有一个既不是有效的HTML也不是XML的内容。考虑到这一事实,很难清理遗留内容,我想使用xdmp:tidy在MarkLogic中整理一下。我目前正在使用ML-8 <sub> <p> <???&dagger;?> </p> </sub> 我正在以某种方式将此内容传递给tidy功能: declare variable $xml as node() := <cont

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

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


我正在以某种方式将此内容传递给tidy功能:

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>)
将变量$xml声明为节点():=

]> ; xdmp:tidy(xdmp:quote($xml//text()), 对 对 不 对 对 )
因此,它返回:

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

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


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

这是因为您认为的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>)
将变量$xml声明为节点():=
你好,世界

]>; 将函数声明为本地:将($input as item()*)复制为item()*{ 对于$input中的$node 返回 类型开关($node) 案例文本() 返回fn:replace($node,“]+\?>”,“”) case元素() 返回 元素{name($node)}{ (:输出此元素中的每个属性:) 对于$node中的$att/@* 返回 属性{name($att)}{$att} , (:递归输出此元素的所有子元素:) 对于$node中的$child 返回本地:复制($child/node()) } (:否则传递它。用于text()、注释和PI:) 默认返回$node }; xdmp:tidy(本地:拷贝($xml), 不 对 不 对 对 )
这将有助于摆脱所有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>)
将变量$xml声明为节点():=
你好,世界

]>; 将函数声明为本地:将($input as item()*)复制为item()*{ 对于$input中的$node 返回 类型开关($node) 案例文本() 返回fn:replace($node,“]+\?>”,“”) case元素() 返回 元素{name($node)}{ (:输出此元素中的每个属性:) 对于$node中的$att/@* 返回 属性{name($att)}{$att} , (:递归输出此元素的所有子元素:) 对于$node中的$child 返回本地:复制($child/node()) } (:否则传递它。用于text()、注释和PI:) 默认返回$node }; xdmp:tidy(本地:拷贝($xml), 不 对 不 对 对 )
这将有助于摆脱所有PI(真实和虚假PI)

问候,


Peter

您能举例说明您希望处理指令是什么样子吗?请不要在这里要求紧急情况-任何问题都不能插队,志愿者不喜欢匆忙。你能举一个例子说明你期望的处理指令是什么样子吗?请不要在这里问紧急情况-任何问题都不能插队,志愿者也不喜欢匆忙。这个答案既有效又完整[而且非常详细]。亲爱的Rachit-好好玩玩StackOverflow。。你要求紧急响应,人们花时间给出了令人惊讶的详细答案。现在请接受答案。这让人们明白,这个请求已经得到了响应,他们可以把精力花在帮助他人上。感谢大家的即兴回复&很抱歉,我急急忙忙地问了这个问题。但是我正在关注来自整洁者的回应。如果tidy抛出一个错误而不是创建一个无效的xml,那就太好了。清理内容对我没有多大帮助,因为内容可能太重,这会增加性能。我宁愿在遗留数据库中清理它。简而言之,我希望tidy抛出一个错误,说“内容不好或不干净”。你能帮帮我吗?嗨,拉希特,那你就完全不懂整洁的意思了。Tidy最初是为了自动修复html页面中的错误而创建的。有关解释,请参阅。如果主要目标是检查错误,那么最好使用一个像样的验证器。看,这个答案既有效又完整[而且非常详细]。亲爱的Rachit-好好玩玩StackOverflow。。你要求紧急响应,人们花时间给出了令人惊讶的详细答案。现在请接受答案。这让人们明白,这个请求已经得到了响应,他们可以把精力花在帮助他人上。感谢大家的即兴回复&很抱歉,我急急忙忙地问了这个问题。但是我正在关注来自整洁者的回应。那将是g