我需要将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>
当只有ROW节点存在数据时(例如:<ROW>Item1</ROW>
),我已经能够让下面的XSLT工作将文件拆分为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>
答案 0 :(得分:1)
您可以使用<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>