使用CDATA标记从Excel导出XML

时间:2015-07-09 13:29:55

标签: xml excel vba export cdata

我正在尝试确定一个简单而有效的过程,用于将数据从excel导出到XML,同时将某些字段包装在CDATA标记中。我已经达到了导出XML的程度(使用概述here的过程),但是我坚持使用注入CDATA标记来包装某些字段值的最佳方法。我进行了广泛的搜索,但没有找到解决方案。如果可能的话,我不希望在我的Excel数据中包含实际的CDATA标签。

当前XML代码示例(删节):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<product>
    <code>1</code>
    <searchEngineSupportPages>
        <searchEngineSupportPage locale="en_US">
            <siteSearchEngineSupports>
                <siteSearchEngineSupport siteCode="CH">
                    <urlValue>test-url</urlValue>
                    <title>Test Title</title>
                    <metaDescription>Test Desc</metaDescription>
                    <metaKeywords>keyword, test</metaKeywords>
                </siteSearchEngineSupport>
            </siteSearchEngineSupports>
        </searchEngineSupportPage>
    </searchEngineSupportPages>
</product>
</products>

所需的XML代码示例(通知CDATA标记):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<product>
    <code>1</code>
    <searchEngineSupportPages>
        <searchEngineSupportPage locale="en_US">
            <siteSearchEngineSupports>
                <siteSearchEngineSupport siteCode="CH">
                    <urlValue>test-url</urlValue>
                    <title>Test Title</title>
                    <metaDescription><![CDATA[Test Desc]]></metaDescription>
                    <metaKeywords><![CDATA[keyword, test]]></metaKeywords>
                </siteSearchEngineSupport>
            </siteSearchEngineSupports>
        </searchEngineSupportPage>
    </searchEngineSupportPages>
</product>
</products>

是否有一种简单有效的方法可确保指定字段的导出XML包含在CDATA标记中? VBA有可能吗?

我并不依赖于我正在使用的流程,所以如果有更好的方法,我会对如何集体解决的其他想法持开放态度。我喜欢Excel XML导出功能,因为它简单而且有效。我不是XML / VBA大师,但我有能力。

提前致谢!

======================================

编辑[2015年7月15日]: Martijn很乐意提供使用XSLT的方法,但想知道是否有更精简的东西可以实现这一目标?

1 个答案:

答案 0 :(得分:0)

您可以使用以下XSLT为您完成这项工作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>

    <xsl:template match="/">
       <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="@*|*">
       <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
       </xsl:copy>
    </xsl:template>

   <xsl:template match="metaDescription|metaKeywords">
      <xsl:copy>
         <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
         <xsl:apply-templates />
         <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
      </xsl:copy>
   </xsl:template>

</xsl:stylesheet>