xml - 根据属性值拆分 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 ======================-->
解决方案
这可以使用 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>
输出是所需的,由三个单独的文件组成。
推荐阅读
- python - 带有 lightgbm 的 GridSearchCV 需要不使用 fit() 方法?
- bash - 在循环 bash 中使用变量
- c++ - 为什么 int 类型的枚举类值不能用作 int
- python - 如何从 DBpedia 中找出所有 skos:broader 关系,以便使用 SPARQL 查询构建概念层次结构(树)
- excel - 如何将蓝色的单元格计数到另一张纸上的单元格中?
- reactjs - React Froala Editor 不显示段落下拉菜单
- c++ - ntdll.dll 库函数中用户模式调用的 STATUS_ACCESS_VIOLATION 原因
- scala - 系统 SBT 没有在代码中提取类型参数,Intellij sbt 可以
- amazon-web-services - AWS Lambda 上的 Apollo graphql 服务无法读取 null 的属性“接受”
- blazor - 函数被执行,我不知道为什么