Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 多字段分组_Xslt_Xslt 2.0 - Fatal编程技术网

Xslt 多字段分组

Xslt 多字段分组,xslt,xslt-2.0,Xslt,Xslt 2.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_

我正在从数据库生成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_许可证号码、IFTA_基地国家、IFTA_基地日期、名称类型、地址类型,但我无法生成这样的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>

您的示例输入记录有两个不同的ADDRESS_类型值,因此如果您按ADDRESS_类型分组,这两个值将是不同的。由于您的输出也显示了这两个不同的值,因此我假设您不希望在分组键列表中使用ADDRESS_TYPE。这才是真正的问题吗


给出了两种组合键的策略。当我尝试使用“concat”策略处理您的数据时,使用您的键列表减去地址类型,它将这两个记录分组在一起。

谢谢,我已经应用了以下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>

感谢大家的鼎力相助。

现在还不太清楚你想要达到什么样的目标。也许可以提供一个更简单但完整的示例?我已经更改了输入文件,现在在根元素T0019下有不同的IFTA_帐户。现在我想使用具有公共IFTA_许可证号码、IFTA_基本国家、IFTA_基本州、名称_类型和地址_类型的组来合并IFTA_帐户记录。您可以看到输入和所需的输出文件。现在清楚了吗??