我需要将XML文件拆分为多个组。将每个节点限制在给定数量的某个节点
样本输入数据:
<RESULT>
<ROW>
<DATA>Item1</DATA>
<DATA1>SubItem1</DATA1>
</ROW>
<ROW>
<DATA>Item2</DATA>
<DATA1>SubItem1</DATA1>
</ROW>
<ROW>
<DATA>Item3</DATA>
<DATA1>SubItem3</DATA1>
</ROW>
<ROW>
<DATA>Item4</DATA>
<DATA1>SubItem4</DATA1>
</ROW>
<ROW>
<DATA>Item5</DATA>
<DATA1>SubItem5</DATA1>
</ROW>
<ROW>
<DATA>Item6</DATA>
<DATA1>SubItem6</DATA1>
</ROW>
</RESULT>
我已经能够使下面的XSLT工作,当数据仅在ROW节点(例如:<ROW>Item1</ROW>
)上存在时,将文件分成3组。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:param name="group-size" select="3"/>
<xsl:template match="/RESULT">
<ROOT>
<xsl:if test="count(//ROW) > 0">
<xsl:apply-templates select="ROW"/>
</xsl:if>
</ROOT>
</xsl:template>
<xsl:template match="ROW">
<xsl:if test="position() mod $group-size = 1">
<RESULT>
<xsl:apply-templates select=".|following-sibling::ROW[position() < $group-size]" mode="list"/>
</RESULT>
</xsl:if>
</xsl:template>
<xsl:template match="ROW" mode="list">
<ROW><xsl:value-of select="current()" /></ROW>
</xsl:template>
</xsl:stylesheet>
但是,我不确定需要如何修改这段代码以解释额外的数据节点,并且仍然将其分成三行一组,从而提供下面所需的结果。我非常感谢任何和所有的帮助!
所以期望的结果应该是这样的:
<RESULT>
<ROW>
<DATA>Item1</DATA>
<DATA1>SubItem1</DATA1>
</ROW>
<ROW>
<DATA>Item2</DATA>
<DATA1>SubItem1</DATA1>
</ROW>
<ROW>
<DATA>Item3</DATA>
<DATA1>SubItem3</DATA1>
</ROW>
</RESULT>
<RESULT>
<ROW>
<DATA>Item4</DATA>
<DATA1>SubItem4</DATA1>
</ROW>
<ROW>
<DATA>Item5</DATA>
<DATA1>SubItem5</DATA1>
</ROW>
<ROW>
<DATA>Item6</DATA>
<DATA1>SubItem6</DATA1>
</ROW>
</RESULT>
您可以使用<xsl:apply-templates select="ROW[position() mod $group-size = 1]"/>
:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:param name="group-size" select="3"/>
<xsl:template match="/RESULT">
<ROOT>
<xsl:apply-templates select="ROW[position() mod $group-size = 1]"/>
</ROOT>
</xsl:template>
<xsl:template match="ROW">
<RESULT>
<xsl:copy-of select=". | following-sibling::ROW[position() < $group-size]"/>
</RESULT>
</xsl:template>
</xsl:stylesheet>