【问题标题】:MarkLogic 5 return elements wrapped in CDATAMarkLogic 5 返回包装在 CDATA 中的元素
【发布时间】:2013-08-22 08:50:07
【问题描述】:

我试图让 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,包括 qconsole 和 eclipse,为方便起见将其隐藏起来。

也就是说,我试图确保将这些元素包装在 CDATA 中的原因是因为它是嵌入另一个和 JAXB 的较大 XML 文档的一部分 对这个特定的内容以及诸如&lt;?THING content ?&gt; 之类的自定义处理指令感到窒息。这只是试图欺骗 JAXB 将其纯粹视为字符串。

【问题讨论】:

  • 您是如何运行该查询的?如果您在 cq 或 qconsole 中运行它,这些工具将使用它们自己的序列化设置。设置不会输出 CDATA,但 XML 将完全等效。

标签: xml xquery cdata marklogic


【解决方案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 将其输出序列化到您的浏览器时,它不再存在。

【讨论】:

    【解决方案2】:

    您似乎发现了一个 MarkLogic 错误。在output section of the XSLT spec 中,它描述了您想要的序列化行为。 MarkLogic 似乎声称支持此功能,尽管我可以通过 Google 找到或搜索 ML 的在线文档的唯一参考是http://docs.marklogic.com/5.0/admin-help/output-options 上与应用服务器配置相关的页面。

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

    这对应于两者的“cdata-section-elements”选项 XSLT xsl:output 指令和 MarkLogic XQuery xdmp:output 序言。

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

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

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

    【讨论】:

    • 原始查询为我输出 CDATA。您是否试图通过 cq 或 qconsole 使其工作?序列化选项必须在外部查询级别,并且 cq 或 qconsole 中的所有内容都嵌套在 xdmp:eval 中。
    • 是的,可能就是这样。尝试使用 xdmp:save() 将结果发送到文件,然后使用文本编辑器查看该文件。
    【解决方案3】:

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

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

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

    -大卫

    【讨论】:

    • 该示例包含花括号,因此实际上无论是否使用 CDATA 包装,它的行为都应该不同。实际上,当删除 CDATA 时它应该变得无效,因为大括号的东西很难形成有效的嵌入表达式。当然,除非大括号被加倍,或者被实体替换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多