1

大家好,我有高度重复的数据,深度为 5 个节点(包括根),需要拆分。(我将在一分钟内包含一个快速示例。)我想要做的是基于 3rd-depth 节点将一个 ~5mb XML 文件解析为更小的子文件。但在那之后,它变得更加复杂。

该任务的要求如下:

  1. 子文件必须维护被提取的第 3 级节点的分层父级,包括它们的属性。
  2. 子文件必须保留所有属性和子节点。
  3. 如果 XSLT 无法处理该作业,请在 Ruby 中尝试。如果您不擅长 XSLT,但可以告诉我如何在 Ruby 甚至 Python 中做到这一点,请随时用这些语言提供答案。(否则尝试坚持使用 XSLT 或伪代码。)

DOM 层次结构:

<xml attr="whatever">
  <major-group name="whatever">
    <minor-group name="whatever">
      <another-group name="whatever">
        <last-node name="whatever"></last-node>
      </another-group>
    </minor-group>
  </major-group>
</xml>

我需要将其拆分为次要组元素,同时保留其孩子和直接父母,并将所有这些(对于每个次要组)放在一个外部文件中。我有几个文件要以这种方式拆分。

而且...以前从未在 Ruby 中解析过 XML,并且刚刚开始使用 XSLT,我还不能编写脚本来完成我的任务。

我很想知道 XSLT 是否能胜任这项任务。 :>

编辑:

这是我生成的代码,能够在文件开头显示样式表。

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml"/>
  <xsl:template match="minor-group">
    <xsl:variable name="filename"><xsl:value-of select="concat(@name,'.xml')"/></xsl:variable>
    <xsl:result-document href="{$filename}">
      <xsl:text disable-output-escaping="yes">
        <![CDATA[<?xml-stylesheet type="text/xsl" href="../web.xslt"?>]]>
      </xsl:text> 
      <xml>
        <xsl:attribute name="whatever"><xsl:value-of select="../../@whatever" /></xsl:attribute>
        <major-group>
          <xsl:attribute name="whatever"><xsl:value-of select="../@whatever" /></xsl:attribute>
          <xsl:copy-of select="."/>
        </major-group>
      </xml>
    </xsl:result-document>
  </xsl:template>
</xsl:stylesheet>
4

2 回答 2

3

要提取“次要组”元素列表,需要以下 XPath 表达式之一。

/xml/major-group/minor-group (显式方式)
/*/*/* (通用的,任何三级元素方式)

在您选择的脚本语言中,将文档读入 DOM,在 XPath 查询上构造一个循环,将结果写入不同的输出文件。

使用 XSLT 1.0,一次不能生成多个输出文档。然而,XSLT 2.0 通过<xsl:result-document>指令支持这一点。

如果您可以使用 XSLT 2.0 引擎,您可以尝试该路线。我在 IBM 的 developerWorks 网站上找到的一个随机页面显示了如何开始:提示:在 XSLT 2.0 中创建多个文件

于 2009-05-08T23:44:12.337 回答
0

我不相信您可以仅使用 XSLT 将一个文件解析为多个输出文件。

如果您要使用 Ruby 将 XML 分解为不同的 XML 文件,然后将单独的 XML 文件多次应用于 XSLT,它应该可以工作。

于 2009-05-08T22:30:52.437 回答