2010-05-07 42 views
0

我生成从如下数据库的XML文件...分组上的多个领域

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

我已经采取了从生成XSLT第一两项纪录。 通过使用XSLT的我已经试过很多的 IFTA_LICENSE_NUMBER,IFTA_BASE_COUNTRY的基础组记录,IFTA_BASE_ST ATE,NAME_TYPE,ADDRESS_TYPE但我没有这样生成的XML ..

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

你想要实现什么样的分组并不是很清楚。也许提供一个更简单但完整的例子? – 2010-05-08 04:03:12

+0

我已经改变了我的输入文件,现在在根元素T0019不同的IFTA_ACCOUNT是否存在。现在我想合并IFTA_ACCOUNT记录使用Group-By谁有一个共同的IFTA_LICENSE_NUMBER,IFTA_BASE_COUNTRY,IFTA_BASE_STATE,NAME_TYPE和ADDRESS_TYPE。你可以看到输入和所需的输出文件。现在清楚了吗? – 2010-05-10 05:10:05

回答

0

你的榜样输入记录有两个不同的ADDRESS_TYPE值,所以如果按ADDRESS_TYPE进行分组,则这两个值是不同的。而且由于你的输出也显示了两个不同的值,所以我假设你不想在你的分组键列表中找到ADDRESS_TYPE。这是真正的问题吗?

The XSLT spec给出了组合键的两种策略。当我对数据尝试'concat'策略时,以及您的密钥列表减去ADDRESS_TYPE时,它将这两个记录组合在一起。

0

谢谢,我已经申请了下面的XSLT来解决这个问题。

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

感谢大家的精彩帮助。