2

我试图让MarkLogic5返回包装在CDATA标记中的项目,但它只是拒绝。不吐,就是不做。我是否使用以下方法吠叫错误的树:-

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,包括qconsoleeclipse,为了方便起见对我隐藏了它。

也就是说,我试图确保将这些元素包装在CDATA中的原因是因为它是嵌入另一个更大XML文档的一部分,而JAXB被这个特定内容以及自定义处理指令(如<?THING content ?>. 这只是试图欺骗JAXB将其纯粹视为字符串。

4

3 回答 3

4

好奇您能否参考任何“我能找到的所有文档”,其中说 MarkLogic 将输出 CDATA 节点?

无论如何,为什么需要 CDATA 部分?没有 CDATA 的 XSLT 将对文本进行正确编码和解析。XML中不需要CDATA 没有技术原因,它只是为了人工编辑的目的,以便更容易不必单独编码每个无效字符。

如果您从样本中删除 CDATA 标记,则没有它们也可以正常工作。

-大卫

于 2013-08-20T11:11:01.200 回答
3

看起来您可能发现了一个 MarkLogic 错误。在XSLT 规范的输出部分,它描述了您想要的序列化行为。MarkLogic 似乎声称支持此功能,尽管我可以通过 Google 找到或搜索 ML 的在线文档的唯一参考是http://docs.marklogic.com/5.0/admin-help/上与 appserver 配置相关的页面输出选项

在关于output-cdata-section-localname它的部分的那个页面上说

这对应于 XSLT xsl:output 指令和 MarkLogic XQuery xdmp:output prolog 语句的“cdata-section-elements”选项。

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

xdmp:output 选项的格式可能不正确。在 XSLT 中,它希望 QName 列表被引用,但是当我尝试添加内部引号时,它不喜欢那样。好像解析没问题,好像看懂了一样。

正如大卫指出的那样,CDATA 实际上只是一种转义语法。您得到的序列化 XML 是有效的、格式良好的 XML。您的 XSLT 处理器是否被它阻塞了?仅当您将 XML 连接到 XQuery 程序或类似程序中时,包含的花括号才会成为问题。如果您将其视为 POX (Plain Old XML) 应该没问题。

于 2013-08-20T13:54:42.057 回答
1

正如迈克所建议的那样,似乎是浏览器中带有 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 将其输出序列化到您的浏览器时,它不再存在。

于 2013-08-21T07:28:32.003 回答