我可以使用XSLT将XML解析为子文件吗? (+替代语言/方法)

时间:2009-05-08 22:17:59

标签: xml xslt split

嘿所有,我有高度重复的数据,深度为5个节点(包括根),需要拆分。 (我将在一分钟内包含一个快速样本。)我要做的是将一个~5mb的XML文件解析为基于第三深度节点的较小子文件。但在那之后,它变得更加复杂。

任务的要求如下:

  1. 子文件必须维护提取的第3级节点的层次结构父节点,包括它们的属性。
  2. 子文件必须保留所有属性和子节点。
  3. 如果XSLT无法处理作业,请在Ruby中尝试。 如果你不擅长XSLT,但可以告诉我如何在Ruby甚至Python中做到这一点,请随意用这些语言提供答案。(否则尝试坚持使用XSLT或伪-code。)
  4. 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>
    

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

    并且......从未在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>
    

2 个答案:

答案 0 :(得分:3)

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

/xml/major-group/minor-group    (the explicit way)
/*/*/*                          (the generic, any-third-level-element way)

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

使用XSLT 1.0,一次无法生成多个输出文档。 Hovever,XSLT 2.0通过<xsl:result-document> instruction支持此功能。

如果你有一个XSLT 2.0引擎,你可以试试这条路线。我在IBM的developerWorks网站上找到的随机页面显示了如何开始:Tip: Create multiple files in XSLT 2.0

答案 1 :(得分:0)

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

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