嘿所有,我有高度重复的数据,深度为5个节点(包括根),需要拆分。 (我将在一分钟内包含一个快速样本。)我要做的是将一个~5mb的XML文件解析为基于第三深度节点的较小子文件。但在那之后,它变得更加复杂。
任务的要求如下:
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>
答案 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,那么它应该可以正常工作。