2016-05-05 63 views
-1

我一直在下面的轉換代碼中工作很長時間。我不確定這個需求在XSLT &中是否可行,需要您的幫助來確定它是否可能使用XSLT。使用XSLT在XML中對錶格元素進行分組

我的輸入XML是如下,

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

輸出XML應儘可能,

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

我看到,其中分組是在散射節點進行各種實例。但我的要求是不同的。我有六個表,其中所有相關的值都是像數組一樣給出的。我必須閱讀所有六個表格,按元素&創建一個組。我應該這樣做,直到所有的節點都被讀取(在這種情況下,大小爲三)

如果你至少可以指導我一個類似的例子,我可以參考我的編碼,這將是一個很大的幫助。

感謝您的幫助。

回答

1

這裏是處理第一「表」兒童和收集兄弟表的兒童中的每個組包裝元素的例子:

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

作爲替代,以收集同級元素,可以使用位置分組:

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