Java中的XSLT:CDATA部分拆分

时间:2013-09-10 06:29:39

标签: java xml xslt cdata

我想替换一个巨大的XML文件中的一些项目,我想我会用XSLT来做。我完全没有经验,所以如果你认为有更好的方法可以做到这一点,请告诉我。

无论如何,作为第一步,我只想复制整个XML。这是我的xsl文件:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="no" cdata-section-elements="script"/>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

相关的Java代码是:

Source xmlInput = new StreamSource(oldProjectStream);
Source xsl = new StreamSource("test.xsl");

Transformer transformer = TransformerFactory.newInstance().newTransformer(xsl);
StreamResult xmlOutput = new StreamResult("output/project.xml");
transformer.transform(xmlInput, xmlOutput);

大部分输出都很好,元素的顺序也没有改变(这可能会变得非常重要)。

XML包含CDATA部分中的一些Lua代码。然而,在一些(看似随机的)点,CDATA部分被关闭并再次重新打开。它似乎与代码中的括号有关,但速度很快 - 1.4 MB XML中有大约5个点,如下所示:

<script><![CDATA[
...
html_encoding["Otilde"  ] = string.char(213)
html_encoding["Ouml"    ]]]><![CDATA[ = string.char(214)
html_encoding["Oslash"  ] = string.char(216)
...
]]></script>

在原始文件中,中间的线看起来就像其他的一样。有数千行我点了点。这是怎么回事?

应该处理XML的(专有)应用程序无法加载它。

1 个答案:

答案 0 :(得分:0)

告诉我们您正在使用哪个XSLT处理器很有用。

如果数据中遇到"]]>",则序列化程序必须关闭并重新打开CDATA部分,因为该序列不能合法地出现在CDATA部分中。在任何其他情况下都不应该这样做,尽管规范可能不会禁止它。