1

该 XML 文件包含去年全年的存档新闻报道。我被要求按故事类别[y|ies] 将这些故事分类到新的 XML 文件中。

big_story_export.xml

变成

lifestyles.xml
food.xml
nascar.xml

...等等。

我使用一次性 python 脚本完成了这项工作,但是我最初尝试使用 XSLT 进行此操作。这让我很沮丧,因为我的 XPATH 选择弄得一团糟。测试文件被完美地转换了,但是将大文件放在我的样式表上导致......什么都没有

您推荐哪些策略来确保此类文件将通过 XSLT 运行?这是供应商交给我的,所以想象一下,在定义这个文件的结构时,我没有太多的影响力。

如果你们想要代码示例,我会把一些放在一起。

如果有的话,我会对一些使 XML+XSLT 顺利协同工作的技巧感到满意。


@Sklivvz

我正在使用 python 的 libxml2 & libxslt 来处理这个。我现在正在研究 xsltproc。

对于这些一次性情况,它似乎是一个很好的工具。谢谢!


@diomidis-spinellis

它的格式很好,尽管(如前所述)我没有能力发现它的有效性。

至于写一个模式,我喜欢这个主意。

如果这是一次性的事情,我在验证这个文件上投入的时间是不切实际的,尽管我预见到必须从我们的供应商处处理更多这样的文件。

编写一个模式(并将其提交给供应商)将是管理这样的 XML funk 的一个极好的长期策略。谢谢!

4

5 回答 5

6

使用 XSLT 处理任意大的 XML 文档的问题在于 XSLT 处理首先将输入文档解析为源树。这棵树被解析到内存中。这意味着最终您会遇到一个足够大的输入文档,即使您使用的是像 Saxon 这样的强大 XSLT 处理器并且您有足够的虚拟内存,也会导致问题。(它可能仍然有效,但会很慢。)

Another reason not to use XSLT for this is that you're producing multiple output documents, which (based on what you've said so far) means you're making multiple passes over your input document.

It may (depending on a lot of factors about your situation that I don't know about) be better to take a SAX-based approach instead of using XSLT. Using a SAX processor, you may be able to write a method that makes a single, forward-only pass through the source document, parsing it as it goes, and writes all of the output documents as it encounters the elements that contain them.

于 2008-09-29T21:25:28.727 回答
3

这听起来像是大型 XML 文件或 XSLT 处理器中的错误。您应该检查您的文件的两件事。

  1. 文件是格式良好的 XML 吗?也就是说,所有标签和属性是否都正确终止和匹配?XML 处理器(如xmlstarlet)可以告诉您这一点。
  2. 该文件是否包含有效的 XML?为此,您需要一个模式和一个 XML 验证器(xmlstarlet也可以做到这一点)。我建议您投入一些精力来编写文件的架构定义。它将大大简化您的调试,因为您可以轻松地查明您可能遇到的问题的确切来源。

如果文件格式正确且有效,但 XSLT 处理器仍然拒绝为您提供您所期望的结果,那么您可以确定问题出在处理器上,您应该尝试使用不同的处理器。

于 2008-09-29T16:36:22.167 回答
2

您使用的是什么语言/解析器?
对于大文件,我尝试使用 Unix 命令行工具。
它们通常比其他解决方案更有效率,并且不会“破坏”大文件。

尝试使用xsltproc

于 2008-09-29T16:32:01.740 回答
2

我可以推荐 Saxon XSLT 处理器吗?我知道它可以处理大文件,只要你给 Java JVM 足够的内存。

另一件事是,您的 XSLT 中可能有一些优化可能会有所帮助,但很难就这样的事情做出笼统的陈述。

于 2008-09-29T17:51:27.757 回答
0

Check out Apache's Xalan C++. In my experience, where others (including Saxon) have failed on "large" XML files (>600 MB), this was able to run with memory to spare.

于 2008-10-23T20:25:48.033 回答