根据节点数拆分XML文件

时间:2016-09-02 17:53:34

标签: xslt xslt-1.0

我需要将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() &lt; $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>

1 个答案:

答案 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() &lt; $group-size]"/>
        </RESULT>
    </xsl:template>

</xsl:stylesheet>