【问题标题】:XSLT in Java: CDATA section splitJava 中的 XSLT:CDATA 部分拆分
【发布时间】:2013-09-10 06:29:38
【问题描述】:

我想替换一个巨大的 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 的(专有)应用程序无法加载它。

【问题讨论】:

  • StackTrace 会很有帮助。
  • 尝试删除cdata-section-elements。 CDATA 是一种在 XML 中完全不需要的便利工具。如果您的专有目标应用程序完全可以处理 XML,那么它将起作用。再说一次,如果您的专有目标应用程序完全可以处理 XML,那么它应该已经可以工作了。
  • @Tomalak 为什么不需要它? 不允许作为 XML 中的内容,但代码可以包含它们。
  • 是的,但&amp;lt;&amp;gt; 在XML 中很容易编码为&amp;lt;&amp;gt;,所以这根本不是限制。
  • 我不允许更改这些部分的内容,所以我不认为这是一个选项。

标签: java xml xslt cdata


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    相关资源
    最近更新 更多