首页 > 解决方案 > 根据属性值拆分 XML 文件

问题描述

需要根据属性值拆分 XML 文件。是否可以使用 XSLT-1.0?如果没有可能用 1.0 版本完成它,我将不胜感激任何更高版本的 XSLT 代码。

这是一个数字拆分属性的值(10、11、12 等)。但我认为解决方案的原理对于数字和非数字序列可能是通用的。当系统找到拆分属性的第一个新(更改)值时,将生成新文件。

(可选问题)。这些操作的 XML 文件有多大?是否可以处理 3gb 文件?30GB的文件?RAM 是否有任何系统要求来处理此类文件大小?

资源:

<objects>
  <obj attribute-1="value" attribute-2="value2" split-attribute="10"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="10"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="10"/>

  <obj attribute-1="value" attribute-2="value2" split-attribute="11"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="11"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="11"/>

  <obj attribute-1="value" attribute-2="value2" split-attribute="12"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="12"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="12"/>
</objects>

期望的输出

<objects>
  <obj attribute-1="value" attribute-2="value2" split-attribute="10"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="10"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="10"/>
</objects>
<!--=========================== file-1.xml ======================-->


<objects>
  <obj attribute-1="value" attribute-2="value2" split-attribute="11"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="11"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="11"/>
</objects>
<!--=========================== file-2.xml ======================-->

<objects>
  <obj attribute-1="value" attribute-2="value2" split-attribute="12"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="12"/>
  <obj attribute-1="value" attribute-2="value2" split-attribute="12"/>
</objects>
<!--=========================== file-3.xml ======================-->

标签: xmlxsltxslt-1.0xslt-2.0

解决方案


这可以使用 XSLT-2.0 及更高版本来完成。所需的xsl:result-document函数在 2.0 版中引入。

现在解决方案很简单:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/objects">
    <xsl:for-each-group select="obj" group-by="@split-attribute">
      <xsl:result-document href="{concat('File-',position(),'.xml')}" indent="yes">
        <objects>
          <xsl:copy-of select="current-group()" />
        </objects>
      </xsl:result-document>
    </xsl:for-each-group>
  </xsl:template>

</xsl:stylesheet>

输出是所需的,由三个单独的文件组成。


推荐阅读