MarkLogic 5返回包含在CDATA中的元素

时间:2013-08-20 10:29:52

标签: xml xquery cdata marklogic

我正在尝试 MarkLogic5 返回包含在 CDATA 标记中的项目,但它只是拒绝。不是barf,只是不这样做。我使用以下方法咆哮错误的树: -

xquery version "1.0-ml";

declare option xdmp:output "cdata-section-elements = text";

<text><![CDATA[\begin{eqnarray}
 \fl {R}_{\mathrm{sw}(e)}=\nonumber\\ \fl \biggl \{ \frac{3{L}_{1}{L}_{2}{Q}_{\mathrm{after}}}{1 2{k}_{h}{A}_{h}\Delta T({L}_{1}+{L}_{2})-({L}_{1}+{L}_{2})^{2}({Q}_{\mathrm{before}}-{Q}_{\mathrm{after}})}-1\biggr \} \nonumber\\ \times ~\frac{{L}_{1}{L}_{2}}{({L}_{1}+{L}_{2}){k}_{h}{A}_{h}}-{R}_{j}-{R}_{\mathrm{CNT}},
            \end{eqnarray} ]]>
</text>

只返回没有 CDATA 标记,这与我能找到的所有文档相反。 我尝试过几种方式返回内容,例如xdmp:quote但是因为我需要使用另一端的 XSLT 来解析内容,所以它确实需要包含在 CDATA中元素。

内容通常是深层嵌套的,但为了方便我在这里进行了简化。

任何线索?

更新

根据Ron和David的回答,它实际上是添加 CDATA ,它只是我的各种 IDE ,包括 qconsole 和< em> eclipse ,为方便起见,将它隐藏起来。

也就是说,我试图确保这些元素包含在 CDATA 中的原因是因为它是嵌入在另一个 JAXB中的更大 XML 文档的一部分对这个特定内容以及<?THING content ?>等自定义处理说明感到窒息。这只是试图欺骗 JAXB 将其简单地视为一个字符串。

3 个答案:

答案 0 :(得分:4)

好奇的是你可以参考任何一个“我能找到的所有文档”,其中MarkLogic将输出CDATA节点吗?“

无论如何,你为什么需要CDATA部分? XSLT将在没有CDATA的情况下对文本进行正确编码和解析。没有技术上的理由CDATA在中需要 ,它仅用于人工编辑的目的,以便不必单独编码每个无效的字符。

如果从样本中删除CDATA标记,它将在没有它们的情况下正常工作。

-David

答案 1 :(得分:3)

看起来您可能找到了MarkLogic错误。在output section of the XSLT spec中,它描述了您想要的序列化行为。 MarkLogic声称支持此功能,但我可以在Google上找到或搜索ML的在线文档的唯一参考是与http://docs.marklogic.com/5.0/admin-help/output-options处的appserver配置相关的页面。

output-cdata-section-localname部分的

部分的该页面上
  

这对应于两者的“cdata-section-elements”选项   XSLT xsl:输出指令和MarkLogic XQuery xdmp:输出   prolog声明。

您可以尝试配置应用服务器(在Output Options部分中)输出<text>作为CDATA并查看它是否有效。不幸的是,你只能在那里设置一个QName。

xdmp:output选项的格式可能不正确。在XSLT中,它希望引用QName列表,但是当我尝试添加内部引号时,它不喜欢它。它似乎正在解析,好像它理解它。

大卫指出,CDATA实际上只是一种逃避语法。您正在获取的序列化XML是有效的,格式良好的XML。你的XSLT处理器是否在窒息?如果您将XML连接到XQuery程序或类似的东西,那么包含的花括号只会是一个问题。如果您将其视为POX(普通旧XML),它应该没问题。

答案 2 :(得分:1)

正如Mike建议的那样,似乎是QC浏览器中的渲染导致CDATA消失。我将示例XQuery更改为:

xquery version "1.0-ml";

declare option xdmp:output "cdata-section-elements = text";

xdmp:save ("/tmp/testfoo.xml", 
<text><![CDATA[\begin{eqnarray}
 \fl {R}_{\mathrm{sw}(e)}=\nonumber\\ \fl \biggl \{ \frac{3{L}_{1}{L}_{2}{Q}_{\mathrm{after}}}{1 2{k}_{h}{A}_{h}\Delta T({L}_{1}+{L}_{2})-({L}_{1}+{L}_{2})^{2}({Q}_{\mathrm{before}}-{Q}_{\mathrm{after}})}-1\biggr \} \nonumber\\ \times ~\frac{{L}_{1}{L}_{2}}{({L}_{1}+{L}_{2}){k}_{h}{A}_{h}}-{R}_{j}-{R}_{\mathrm{CNT}},
        \end{eqnarray} ]]>
</text>
)

查看磁盘上的文件,它看起来像这样:

<text><![CDATA[\begin{eqnarray}^
 \fl {R}_{\mathrm{sw}(e)}=\nonumber\\ \fl \biggl \{ \frac{3{L}_{1}{L}_{2}{Q}_{\mathrm{after}}}{1 2{k}_{h}{A}_{h}\Delta T({L}_{1}+{L}_{2})-({L}_{1}+{L}_{2})^{2}({Q}_{\mathrm{before}}-{Q}_{\mathrm{after}})}-1\biggr \} \nonumber\\ \times ~\frac{{L}_{1}{L}_{2}}{({L}_{1}+{L}_{2}){k}_{h}{A}_{h}}-{R}_{j}-{R}_{\mathrm{CNT}},^M
        \end{eqnarray}
]]></text>

当QC处理查询产生的XML时,CDATA被淘汰,因为MarkLogic从不在内部保留它。因此,当QC将其输出序列化到您的浏览器时,它就不再存在了。