根据节点数拆分XML文件



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

您可以使用<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>

相关内容

  • 没有找到相关文章

最新更新