2016-09-02 4 views
0

Ich muss eine XML-Datei in Gruppen aufteilen. Limitiert jede auf eine bestimmte Nummer eines bestimmten Knotens.Split-XML-Datei basierend auf der Anzahl der Knoten

Probeneingangsdaten:

<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> 

ich in der Lage bin, die unten XSLT erhalten arbeiten, um die Datei in Gruppen von 3 zu spalten, wenn ist es an dem ROW Knoten vorhanden nur Daten (zum Beispiel: <ROW>Item1</ROW>) .

<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> 

Aber ich bin nicht sicher, wie dieser Code geändert werden muss für die zusätzlichen Datenknoten zu berücksichtigen und aufgeteilt nach wie vor in Gruppen von drei Reihen, unter das gewünschte Ergebnis bereitstellt. Ich schätze jede Hilfe sehr!

So sollte das gewünschte Ergebnis wie folgt aussehen:

<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> 

Antwort

1

Sie <xsl:apply-templates select="ROW[position() mod $group-size = 1]"/> verwenden können:

<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> 
+0

Das funktionierte ganz genau, wie ich brauchte es. Vielen Dank! – brad999

Verwandte Themen