5

在此先感谢您的帮助...

我遇到了一个问题,XML 文件未能通过 DTD 验证(通过 antxmlvalidate任务),但 XML 文档中报告的错误与正在验证的文档的内容不匹配。此外,在 Oxygen 中打开的相同文件可以毫无问题地进行验证。

ant 输出报告错误的示例如下:

[xmlvalidate] /Path/to/file.xml:240:91: Attribute "match_style" with value "ble" must have a value from the list "any all none ".

目视检查相关文件时,第match_style240 行的属性值为all. 对文件的搜索显示ble,虽然它确实在文档中多次出现(作为tablein 标记的子字符串,也enable作为属性名称),但在第 145 行和第 328 行之间根本没有出现。

我尝试手动编辑 XML 文件并重新验证。如果我从文件中早于报告的错误(不进行其他更改)中删除换行符或其他空格(有时如果我添加换行符),它偶尔会完全修复问题,然后文件将验证。在其他情况下,它仍然会失败,但错误在文件的下方,并且对更接近新错误的空白进行额外的编辑将修复问题或将“错误”进一步向下移动。我无法辨别出这样的编辑会解决什么问题,哪些不会解决问题的任何押韵或理由。

只是重复重点:有时更改空格而不进行其他更改会导致文件验证。

我已经在 XML 文件中搜索了可能会做奇怪事情的不可见字符和控制字符,但除了花园品种的空白之外,我什么也没找到,所有这些都应该在。

这些文件是通过 XSLT 2.0 转换从各种其他 XML 风格的源文件生成的。转换是通过Java使用 Saxon 的任务在 ant 构建中完成的。(我无法让XSLT任务或Saxon任务按预期工作,因为我的 XSL 在某些情况下会从单个源文件生成多个结果文档,并且这些任务似乎总是忽略除第一个结果文档之外的所有结果文档。 ) 这里的任务:

<java classname="net.sf.saxon.Transform" fork="true"
    output="${dest.dir}/build"
    resultproperty="transform_result"
    failonerror="true">
    <arg line="-o ${dest.dir}/ ${source.dir}/xml_sources ${source.dir}/xsl/transform.xsl"/>
</java>

我还在 XSL 和源 XML 文件中搜索了不寻常的字符,并在 XSL 中使用了字符映射并在结果文档中缩进,以确保不寻常的空白字符不会发生任何奇怪的事情。没有发现任何奇怪的东西,字符映射或缩进更改的唯一区别与手动编辑空格基本相同 - “错误”有时会四处移动,但仍然会发生。

我尝试过使用不同版本的 Saxon 和不同版本的 Ant,但没有不同的结果。问题开始前一段时间(不完全确定是什么时候),但从前一切都可以正常工作,所以我尝试使用旧版本的 XSL 和源代码,但没有找到旧版本的东西' t 显示问题(尽管由于从 CVS 切换到 SVN,并且 CVS 不再存在,我可能根本无法回到足够远的地方,因为一些最旧的修订现在丢失了)。

文件必须验证的 DTD 不是我的 - 我无法更改它或切换到模式。

我通常在 Mac 上工作(目前运行 10.7.5),但问题也发生在 Linux 上(不确定是什么版本)。我真正无法使用的一个变量是Java。上次运行正常时,我可能一直在运行 Java 1.5——我现在使用的是 1.7,而且当我运行 1.6 时肯定会发生这种情况。我无法在可用的机器上回到 1.5。

这就是我能想到的所有可能相关的信息。

我对这个问题束手无策。在我所有的研究中,我从来没有听说过其他人报告过同样的问题,更不用说解决它了。任何关于可能出错的想法将不胜感激。

谢谢!

4

1 回答 1

2

我怀疑是 JDK 附带的 Xerces 解析器,它有问题。尝试使用 Apache 的 Xerces 版本,这要好得多。

(我这样说是因为我以前看到过 JDK 版本的 Xerces 误报包含文档中存在的字符串的属性值,但不是属性值。)

于 2013-11-17T16:43:12.777 回答