2016-05-05 11 views
-1

Ich habe ziemlich lange im unten stehenden Konvertierungscode gearbeitet. Ich bin mir nicht sicher, ob die Anforderung in XSLT & möglich ist, benötigen Sie Ihre Hilfe, um festzustellen, ob es mit XSLT möglich ist.Gruppieren von Tabellenelementen in XML mit XSLT

Meine XML-Eingabe als unten,

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <base:callFlowResponse xmlns:base="http://schema/webservices.elink.solcorp.com"> 
     <Messages> 
      <More/> 
     </Messages> 
     <OUTPUT> 
       <MIR-DV-INT>100</MIR-DV-INT> 
       <MIR-DEP-AMT>0000000000042832.50</MIR-DEP-AMT> 
       <MIR-DV-TOTAL-AMT-DUE>1000</MIR-DV-TOTAL-AMT-DUE> 
       <MIR-MAX-REM-TOP-PREM>1000</MIR-MAX-REM-TOP-PREM> 
       <MIR-DV-DUE-DT-G> 
        <TableMIR-DV-DUE-DT-T> 
        <MIR-DV-DUE-DT-T>2011-01-01</MIR-DV-DUE-DT-T> 
        <MIR-DV-DUE-DT-T/> 
        <MIR-DV-DUE-DT-T/> 
        </TableMIR-DV-DUE-DT-T> 
       </MIR-DV-DUE-DT-G> 
       <MIR-DV-POL-MPREM-AMT-G> 
        <TableMIR-DV-POL-MPREM-AMT-T> 
        <MIR-DV-POL-MPREM-AMT-T>1000</MIR-DV-POL-MPREM-AMT-T> 
        <MIR-DV-POL-MPREM-AMT-T/> 
        <MIR-DV-POL-MPREM-AMT-T/> 
        </TableMIR-DV-POL-MPREM-AMT-T> 
       </MIR-DV-POL-MPREM-AMT-G> 
       <MIR-DV-BASIC-SERV-TAX-AMT-G> 
        <TableMIR-DV-BASIC-SERV-TAX-AMT-T> 
        <MIR-DV-BASIC-SERV-TAX-AMT-T>10000</MIR-DV-BASIC-SERV-TAX-AMT-T> 
        <MIR-DV-BASIC-SERV-TAX-AMT-T/> 
        <MIR-DV-BASIC-SERV-TAX-AMT-T/> 
        </TableMIR-DV-BASIC-SERV-TAX-AMT-T> 
       </MIR-DV-BASIC-SERV-TAX-AMT-G> 
       <MIR-DV-TOTL-SW-CESS-AMT-G> 
        <TableMIR-DV-TOTL-SW-CESS-AMT-T> 
        <MIR-DV-TOTL-SW-CESS-AMT-T>1000</MIR-DV-TOTL-SW-CESS-AMT-T> 
        <MIR-DV-TOTL-SW-CESS-AMT-T/> 
        <MIR-DV-TOTL-SW-CESS-AMT-T/> 
        </TableMIR-DV-TOTL-SW-CESS-AMT-T> 
       </MIR-DV-TOTL-SW-CESS-AMT-G> 
       <MIR-DV-KR-KL-CESS-AMT-G> 
        <TableMIR-DV-KR-KL-CESS-AMT-T> 
        <MIR-DV-KR-KL-CESS-AMT-T>1000</MIR-DV-KR-KL-CESS-AMT-T> 
        <MIR-DV-KR-KL-CESS-AMT-T/> 
        <MIR-DV-KR-KL-CESS-AMT-T/> 
        </TableMIR-DV-KR-KL-CESS-AMT-T> 
       </MIR-DV-KR-KL-CESS-AMT-G> 
       <MIR-DV-PREM-AMT-G> 
        <TableMIR-DV-PREM-AMT-T> 
        <MIR-DV-PREM-AMT-T>10000</MIR-DV-PREM-AMT-T> 
        <MIR-DV-PREM-AMT-T/> 
        <MIR-DV-PREM-AMT-T/> 
        </TableMIR-DV-PREM-AMT-T> 
       </MIR-DV-PREM-AMT-G> 
       <MIR-DV-ADV-PREM-AMT>1000</MIR-DV-ADV-PREM-AMT> 
       <MIR-TOTL-SW-BH-CESS-TAX-AMT>1000</MIR-TOTL-SW-BH-CESS-TAX-AMT> 
       <MIR-KR-KL-CESS-TAX-AMT>1000</MIR-KR-KL-CESS-TAX-AMT> 
      </OUTPUT> 
     </base:callFlowResponse> 
    </S:Body> 
</S:Envelope> 

Die XML-Ausgabe als sein sollte,

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <base:callFlowResponse xmlns:base="http://schema/webservices.elink.solcorp.com"> 
     <Messages> 
      <More/> 
     </Messages> 
     <OUTPUT> 
       <MIR-DV-INT>100</MIR-DV-INT> 
       <MIR-DEP-AMT>0000000000042832.50</MIR-DEP-AMT> 
       <MIR-DV-TOTAL-AMT-DUE>1000</MIR-DV-TOTAL-AMT-DUE> 
       <MIR-MAX-REM-TOP-PREM>1000</MIR-MAX-REM-TOP-PREM> 
       <GROUP-1> 
        <MIR-DV-DUE-DT-T>2011-01-01</MIR-DV-DUE-DT-T> 
        <MIR-DV-POL-MPREM-AMT-T>1000</MIR-DV-POL-MPREM-AMT-T> 
        <MIR-DV-BASIC-SERV-TAX-AMT-T>10000</MIR-DV-BASIC-SERV-TAX-AMT-T> 
        <MIR-DV-TOTL-SW-CESS-AMT-T>1000</MIR-DV-TOTL-SW-CESS-AMT-T> 
        <MIR-DV-KR-KL-CESS-AMT-T>1000</MIR-DV-KR-KL-CESS-AMT-T> 
        <MIR-DV-PREM-AMT-T>10000</MIR-DV-PREM-AMT-T> 
       </GROUP-1> 
      <GROUP-2> 
        <MIR-DV-DUE-DT-T></MIR-DV-DUE-DT-T> 
        <MIR-DV-POL-MPREM-AMT-T></MIR-DV-POL-MPREM-AMT-T> 
        <MIR-DV-BASIC-SERV-TAX-AMT-T></MIR-DV-BASIC-SERV-TAX-AMT-T> 
        <MIR-DV-TOTL-SW-CESS-AMT-T></MIR-DV-TOTL-SW-CESS-AMT-T> 
        <MIR-DV-KR-KL-CESS-AMT-T></MIR-DV-KR-KL-CESS-AMT-T> 
        <MIR-DV-PREM-AMT-T></MIR-DV-PREM-AMT-T> 
       </GROUP-2>    
      <GROUP-3> 
        <MIR-DV-DUE-DT-T></MIR-DV-DUE-DT-T> 
        <MIR-DV-POL-MPREM-AMT-T></MIR-DV-POL-MPREM-AMT-T> 
        <MIR-DV-BASIC-SERV-TAX-AMT-T></MIR-DV-BASIC-SERV-TAX-AMT-T> 
        <MIR-DV-TOTL-SW-CESS-AMT-T></MIR-DV-TOTL-SW-CESS-AMT-T> 
        <MIR-DV-KR-KL-CESS-AMT-T></MIR-DV-KR-KL-CESS-AMT-T> 
        <MIR-DV-PREM-AMT-T></MIR-DV-PREM-AMT-T> 
       </GROUP-3> 
       <MIR-DV-ADV-PREM-AMT>1000</MIR-DV-ADV-PREM-AMT> 
       <MIR-TOTL-SW-BH-CESS-TAX-AMT>1000</MIR-TOTL-SW-BH-CESS-TAX-AMT> 
       <MIR-KR-KL-CESS-TAX-AMT>1000</MIR-KR-KL-CESS-TAX-AMT> 
      </OUTPUT> 
     </base:callFlowResponse> 
    </S:Body> 
</S:Envelope> 

ich verschiedene Beispiele gesehen haben, in der Gruppierung auf verstreuten Knoten erfolgt. Aber meine Anforderung ist anders. Ich habe sechs Tabellen, in denen alle zugehörigen Werte wie Array angegeben sind. Ich muss alle sechs Tabellen Element für Element lesen & eine einzelne Gruppe erstellen. Ich sollte dies tun, bis alle Knoten gelesen werden (in diesem Fall ist die Größe drei)

Es wäre eine große Hilfe, wenn Sie mich zumindest mit einem ähnlichen Beispiel, das ich für meine Codierung verweisen könnte.

Danke für Ihre Hilfe. Hier

Antwort

1

ist ein Beispiel, das die erste „Tisch“ Kinder und sammelt die Geschwister Tabelle Kinder in jeder Gruppe Wrapperelement verarbeitet:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* , node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="OUTPUT/*[*[starts-with(local-name(), 'Table')]][1]"> 
     <xsl:apply-templates select="*/*" mode="group"/> 
    </xsl:template> 

    <xsl:template match="OUTPUT/*[*[starts-with(local-name(), 'Table')]][position() gt 1]"/> 

    <xsl:template match="*" mode="group"> 
     <xsl:variable name="pos" select="position()"/> 
     <xsl:element name="group-{position()}"> 
      <xsl:copy-of select="., ../../following-sibling::*[*[starts-with(local-name(), 'Table')]]/*/*[$pos]"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Als Alternative die Geschwisterelemente zu sammeln, Sie Positions Gruppierung verwenden:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* , node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="OUTPUT"> 
     <xsl:copy> 
      <xsl:for-each-group select="*" group-adjacent="boolean(self::*[*[starts-with(local-name(), 'Table')]])"> 
       <xsl:choose> 
        <xsl:when test="current-grouping-key()"> 
         <xsl:variable name="row-count" select="count(*[1]/*)"/> 
         <xsl:for-each-group select="current-group()/*/*" group-by="position() mod $row-count"> 
          <xsl:element name="GROUP-{position()}"> 
           <xsl:copy-of select="current-group()"/> 
          </xsl:element> 
         </xsl:for-each-group> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:copy-of select="current-group()"/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet>