使用 xsl 时 CDATA 未包含在我的 XML 中

Posted

技术标签:

【中文标题】使用 xsl 时 CDATA 未包含在我的 XML 中【英文标题】:CDATA not included in my XML when using xsl 【发布时间】:2022-01-07 20:51:16 【问题描述】:

我目前正在做一个小项目,通过 VBA 将数据从 MS Access 导出为 XML 格式。我有一个部分应该在其中添加带有 CDATA 标记的代码。 但是,当我尝试实现它时,我的代码中缺少 CDATA 部分。这是我到目前为止所得到的:

 Dim doc As New MSXML2.DOMDocument60
 Dim rulescript As IXMLDOMElement
 Dim code As IXMLDOMElement
 Dim cdata As IXMLDOMCDATASection

 'Append ruleScript 
 Set rulescript = doc.createElement("ruleScript")
 doc.appendChild rulescript

 'Append code
 Set code = doc.createElement("code")
 rulescript.appendChild code
        
 'Create code and append it as CDATA section
 Set cdata = doc.createCDATASection("code")
 cdata.Data = "this is a dummy code."
 code.appendChild cdata

XLS:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"
cdata-section-elements="code" encoding="UTF-8"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

这就是它的样子:

<ruleScript>
     <code><![CDATA[this is a dummy code.]]></code>
</ruleScript>

但不幸的是,结果是这样的,没有 CDATA:

<ruleScript>
     <code>this is a dummy code.</code>
</ruleScript>

我环顾四周,找不到我的解决方案,因此我将不胜感激。

编辑: 看了一会儿,我意识到问题不是代码的实现。问题是我用来保存文档的xsl:

出于某种原因,如果我只使用

Debug.Print doc.XML

,它工作得很好。我还没弄清楚为什么会这样。

【问题讨论】:

rootNode 只是我之前创建的另一个节点。我没有意识到这可能会引起混乱。我会编辑它 这对我有用:Debug.Print doc.XML 给了&lt;ruleScript&gt;&lt;code&gt;&lt;![CDATA[this is a dummy code.]]&gt;&lt;/code&gt;&lt;/ruleScript&gt; 和蒂姆一样,我试过doc.Save,结果文件也是正确的。如果你只使用这段代码,你会遇到同样的问题吗? 哦,如果我只使用块代码,它也适用于我。我想它一定是其他的东西不起作用。 我不熟悉 XML(事实上,我几乎不使用它们!)所以一个快速的谷歌给出了this。您可能想要更新您的问题标题以更好地反映您当前的问题。 @咪咪 【参考方案1】:

当需要 CDATA 部分时,您需要添加控制 XML 元素值的 cdata-section-elements 属性。它是一个空格分隔的列表,因此您可以添加任意数量的元素名称。

检查一下。

<xsl:output method="xml" indent="yes" cdata-section-elements="code" encoding="utf-8" />

【讨论】:

我添加了cdata-section-elements="code",但它似乎仍然不起作用。 不再需要在 VBA 中使用 `Set cdata = doc.createCDATASection("code")'。现在这是 XSLT 的职责。

以上是关于使用 xsl 时 CDATA 未包含在我的 XML 中的主要内容,如果未能解决你的问题,请参考以下文章

使用 CDATA 元素对 xml 中的 uuid 进行排序的 xslt 模板

使用 XSL 解析 XML 时出现问题

如何用Dom4j获取CDATA结点内容

WSO2 AM 1.9 - 将CDATA保留在有效负载工厂中

使用 CDATA 解析 xml 响应的参数中的 html 数据

如何声明然后在 CDATA 块中使用变量?