2010-05-07 5 views
0

Je générer un fichier XML de base de données comme ci-dessous ...Regroupement sur plusieurs champs

<?xml version = '1.0'?> 
<T0019> 
    <IFTA_ACCOUNT> 
     <IFTA_CARRIER_ID_NUMBER>705</IFTA_CARRIER_ID_NUMBER> 
     <IFTA_LICENSE_NUMBER>631227666</IFTA_LICENSE_NUMBER> 
     <IFTA_BASE_COUNTRY>US</IFTA_BASE_COUNTRY> 
     <IFTA_BASE_STATE>AL</IFTA_BASE_STATE> 
     <IFTA_STATUS_CODE>0 </IFTA_STATUS_CODE> 
     <IFTA_STATUS_DATE>2009-01-01</IFTA_STATUS_DATE> 
     <IFTA_ISSUE_DATE>2009-01-01</IFTA_ISSUE_DATE> 
     <IFTA_EXPIRE_DATE>2009-12-01</IFTA_EXPIRE_DATE> 
     <IFTA_UPDATE_DATE>2008-12-30</IFTA_UPDATE_DATE> 
     <NAME_TYPE>LG</NAME_TYPE> 
     <NAME>K D L TRUCKING INC</NAME> 
     <ADDRESS_TYPE>PH</ADDRESS_TYPE> 
     <STREET_LINE_1>200 MARTIN LANE</STREET_LINE_1> 
     <CITY>OHATCHEE</CITY> 
     <STATE>AL</STATE> 
     <ZIP_CODE>36271</ZIP_CODE>  
     <COUNTY>CALHOUN COUNTY</COUNTY> 
     <COUNTRY>US</COUNTRY> 
    </IFTA_ACCOUNT> 

    <IFTA_ACCOUNT> 
     <IFTA_CARRIER_ID_NUMBER>705</IFTA_CARRIER_ID_NUMBER> 
     <IFTA_LICENSE_NUMBER>631227666</IFTA_LICENSE_NUMBER> 
     <IFTA_BASE_COUNTRY>US</IFTA_BASE_COUNTRY> 
     <IFTA_BASE_STATE>AL</IFTA_BASE_STATE> 
     <IFTA_STATUS_CODE>0 </IFTA_STATUS_CODE> 
     <IFTA_STATUS_DATE>2009-01-01</IFTA_STATUS_DATE> 
     <IFTA_ISSUE_DATE>2009-01-01</IFTA_ISSUE_DATE> 
     <IFTA_EXPIRE_DATE>2009-12-01</IFTA_EXPIRE_DATE> 
     <IFTA_UPDATE_DATE>2008-12-30</IFTA_UPDATE_DATE> 
     <NAME_TYPE>LG</NAME_TYPE> 
     <NAME>K D L TRUCKING INC</NAME> 
     <ADDRESS_TYPE>MA</ADDRESS_TYPE> 
     <STREET_LINE_1>200 MARTIN LANE</STREET_LINE_1> 
     <CITY>OHATCHEE</CITY> 
     <STATE>AL</STATE> 
     <ZIP_CODE>36271</ZIP_CODE> 
     <COUNTRY>US</COUNTRY> 
    </IFTA_ACCOUNT>  
</T0019> 

J'ai pris deux premiers disques de XSLT généré. Avec l'utilisation de XSLT j'ai essayé beaucoup de groupe d'archives sur la base de IFTA_LICENSE_NUMBER, IFTA_BASE_COUNTRY, IFTA_BASE_ST ate, name_type, Address_Type mais je pas XML généré comme celui-ci ..

<?xml version="1.0" encoding="UTF-8" ?> 
<T0019> 
    <IFTA_ACCOUNT> 
     <IFTA_CARRIER_ID_NUMBER>705</IFTA_CARRIER_ID_NUMBER> 
     <IFTA_BASE_COUNTRY>US</IFTA_BASE_COUNTRY> 
     <IFTA_BASE_STATE>AL</IFTA_BASE_STATE> 
     <IFTA_LICENSE_NUMBER>631227666</IFTA_LICENSE_NUMBER> 
     <IFTA_STATUS_CODE>0</IFTA_STATUS_CODE> 
     <IFTA_STATUS_DATE>2009-01-01</IFTA_STATUS_DATE> 
     <IFTA_ISSUE_DATE>2009-01-01</IFTA_ISSUE_DATE> 
     <IFTA_EXPIRE_DATE>2009-12-01</IFTA_EXPIRE_DATE> 
     <IFTA_UPDATE_DATE>2008-12-30</IFTA_UPDATE_DATE> 
    <IFTA_NAME> 
     <NAME_TYPE>LG</NAME_TYPE> 
     <NAME>K D L TRUCKING INC</NAME> 
     <IFTA_ADDRESS> 
       <ADDRESS_TYPE>PH</ADDRESS_TYPE> 
       <STREET_LINE_1>200 MARTIN LANE</STREET_LINE_1> 
       <STREET_LINE_2 /> 
       <CITY>OHATCHEE</CITY> 
       <STATE>AL</STATE> 
       <ZIP_CODE>36271</ZIP_CODE> 
       <COUNTY>CALHOUN COUNTY</COUNTY> 
       <COUNTRY>US</COUNTRY> 
      </IFTA_ADDRESS> 
     <IFTA_ADDRESS> 
       <ADDRESS_TYPE>MA</ADDRESS_TYPE> 
       <STREET_LINE_1>200 MARTIN LANE</STREET_LINE_1> 
       <STREET_LINE_2 /> 
       <CITY>OHATCHEE</CITY> 
       <STATE>AL</STATE> 
       <ZIP_CODE>36271</ZIP_CODE> 
       <COUNTY /> 
       <COUNTRY>US</COUNTRY> 
      </IFTA_ADDRESS> 
     </IFTA_NAME> 
    </IFTA_ACCOUNT> 
    </T0019> 
+0

Il n'est pas très clair quel groupement vous voulez réaliser. Peut-être fournir un exemple plus simple, mais complet? –

+0

J'ai changé mon fichier d'entrée, maintenant sous l'élément racine T0019 IFTA_ACCOUNT différents sont là. Maintenant je veux fusionner IFTA_ACCOUNT Enregistrement en utilisant Group-By qui a un commun IFTA_LICENSE_NUMBER, IFTA_BASE_COUNTRY, IFTA_BASE_STATE, NAME_TYPE et ADDRESS_TYPE. Vous pouvez voir l'entrée et le fichier de sortie désiré. Maintenant, est-ce clair ?? –

Répondre

0

Vos enregistrements d'entrée exemple ont deux valeurs ADDRESS_TYPE différentes, donc si vous groupiez par ADDRESS_TYPE, ces deux seraient distincts. Et puisque votre sortie affiche également les deux valeurs distinctes, je suppose que vous ne voulez pas vraiment ADDRESS_TYPE dans votre liste de clés de regroupement. Est-ce le vrai problème?

The XSLT spec donne deux stratégies pour les clés composites. Lorsque j'ai essayé la stratégie 'concat' avec vos données, et avec votre liste de clés moins ADDRESS_TYPE, il a regroupé ces deux enregistrements.

0

Merci, j'ai appliqué XSLT suivant pour résoudre ce problème.

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="T0019"> 
     <xsl:copy> 
      <xsl:for-each-group select="IFTA_ACCOUNT" group-by="IFTA_LICENSE_NUMBER"> 
       <xsl:for-each-group select="current-group()" group-by="IFTA_BASE_COUNTRY"> 
        <xsl:for-each-group select="current-group()" group-by="IFTA_BASE_STATE"> 
         <IFTA_ACCOUNT> 
          <xsl:apply-templates select="IFTA_CARRIER_ID_NUMBER|IFTA_BASE_COUNTRY|IFTA_BASE_STATE|IFTA_LICENSE_NUMBER|IFTA_STATUS_CODE|IFTA_STATUS_DATE|IFTA_ISSUE_DATE|IFTA_EXPIRE_DATE|IFTA_UPDATE_DATE"/> 
          <xsl:for-each-group select="current-group()" group-by="NAME_TYPE"> 
           <IFTA_NAME> 
            <xsl:apply-templates select="NAME_TYPE|NAME"/> 
            <xsl:for-each select="current-group()"> 
             <IFTA_ADDRESS> 
              <xsl:apply-templates select="ADDRESS_TYPE|STREET_LINE_1|STREET_LINE_2|CITY|STATE|ZIP_CODE|COUNTY|COUNTRY"/>            
             </IFTA_ADDRESS>           
            </xsl:for-each>          
           </IFTA_NAME> 
          </xsl:for-each-group>        
         </IFTA_ACCOUNT>       
        </xsl:for-each-group>      
       </xsl:for-each-group> 
      </xsl:for-each-group> 
     </xsl:copy> 

    </xsl:template> 
    <xsl:template match="IFTA_CARRIER_ID_NUMBER"> 
     <IFTA_CARRIER_ID_NUMBER> 
      <xsl:value-of select="."/> 
     </IFTA_CARRIER_ID_NUMBER>    
    </xsl:template>  
    <xsl:template match="IFTA_LICENSE_NUMBER"> 
     <IFTA_LICENSE_NUMBER> 
      <xsl:value-of select="."/> 
     </IFTA_LICENSE_NUMBER>    
    </xsl:template> 
    <xsl:template match="IFTA_BASE_COUNTRY"> 
     <IFTA_BASE_COUNTRY> 
      <xsl:value-of select="."/> 
     </IFTA_BASE_COUNTRY>       
    </xsl:template> 
    <xsl:template match="IFTA_BASE_STATE"> 
     <IFTA_BASE_STATE> 
      <xsl:value-of select="."/> 
     </IFTA_BASE_STATE>    
    </xsl:template> 
    <xsl:template match="IFTA_STATUS_CODE"> 
     <IFTA_STATUS_CODE> 
      <xsl:value-of select="."/> 
     </IFTA_STATUS_CODE>    
    </xsl:template> 
    <xsl:template match="IFTA_STATUS_DATE"> 
     <IFTA_STATUS_DATE> 
      <xsl:value-of select="."/> 
     </IFTA_STATUS_DATE>    
    </xsl:template> 
    <xsl:template match="IFTA_ISSUE_DATE"> 
     <IFTA_ISSUE_DATE> 
      <xsl:value-of select="."/> 
     </IFTA_ISSUE_DATE>    
    </xsl:template> 
    <xsl:template match="IFTA_EXPIRE_DATE"> 
     <IFTA_STATUS_DATE> 
      <xsl:value-of select="."/> 
     </IFTA_STATUS_DATE>    
    </xsl:template> 
    <xsl:template match="IFTA_UPDATE_DATE"> 
     <IFTA_ISSUE_DATE> 
      <xsl:value-of select="."/> 
     </IFTA_ISSUE_DATE>    
    </xsl:template> 
    <xsl:template match="NAME_TYPE"> 
     <NAME_TYPE> 
      <xsl:value-of select="."/> 
     </NAME_TYPE>    
    </xsl:template> 
    <xsl:template match="NAME"> 
     <NAME_TYPE> 
      <xsl:value-of select="."/> 
     </NAME_TYPE>    
    </xsl:template>  
    <xsl:template match="ADDRESS_TYPE"> 
     <ADDRESS_TYPE> 
      <xsl:value-of select="."/> 
     </ADDRESS_TYPE>    
    </xsl:template> 

    <xsl:template match="STREET_LINE_1"> 
     <STREET_LINE_1> 
      <xsl:value-of select="."/> 
     </STREET_LINE_1>    
    </xsl:template> 
    <xsl:template match="STREET_LINE_2"> 
     <STREET_LINE_2> 
      <xsl:value-of select="."/> 
     </STREET_LINE_2>    
    </xsl:template> 
    <xsl:template match="CITY"> 
     <CITY> 
      <xsl:value-of select="."/> 
     </CITY>    
    </xsl:template> 
    <xsl:template match="STATE"> 
     <STATE> 
      <xsl:value-of select="."/> 
     </STATE>    
    </xsl:template> 
    <xsl:template match="ZIP_CODE"> 
     <ZIP_CODE> 
      <xsl:value-of select="."/> 
     </ZIP_CODE>    
    </xsl:template> 
    <xsl:template match="COUNTY"> 
     <COUNTY> 
      <xsl:value-of select="."/> 
     </COUNTY>    
    </xsl:template> 
    <xsl:template match="COUNTRY"> 
     <COUNTRY> 
      <xsl:value-of select="."/> 
     </COUNTRY>    
    </xsl:template>  
</xsl:stylesheet> 

Merci à tous pour votre aide merveilleuse.

Questions connexes