XSLT for-each-group 导致重复节点
XSLT for-each-group resulted in duplicate nodes
我需要将具有 2 层数据(员工和地址)和具有不同地址的同一员工的多个记录转换为按员工 ID 分组的源 XML。这是 XSL 2.0。下面是我的来源 XML、XSLT 和当前输出。对于具有 2 个地址的第一条记录,输出将 2 个地址复制了两次。我试图将处理 Addresses_group 的 <xsl:for-each>
移动到外循环,但这导致没有数据。需要正确方法的帮助才能做到这一点。谢谢
<?xml version='1.0' encoding='UTF-8'?>
<wd:Report_Data xmlns:wd="urn:com.abc/bsvc">
<wd:Report_Entry>
<wd:EMPLID>12345</wd:EMPLID>
<wd:N_BLDG_ID>N</wd:N_BLDG_ID>
<wd:LOCATION_NAME>San Diego</wd:LOCATION_NAME>
<wd:ACTION_EFF_DT>1020-01-06</wd:ACTION_EFF_DT>
<wd:Address_Usage>home</wd:Address_Usage>
<wd:Addresses_group>
<wd:Address_ID>ADDRESS_REFERENCE-333</wd:Address_ID>
<wd:ADDRESS1>#112233</wd:ADDRESS1>
<wd:ADDRESS2>P.O.Box 222</wd:ADDRESS2>
<wd:CITY>Moore</wd:CITY>
<wd:STATE>NJ</wd:STATE>
<wd:ZIP>07945</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:Address_ID>ADDRESS_REFERENCE-6-444</wd:Address_ID>
<wd:ADDRESS1>123 Good Ave</wd:ADDRESS1>
<wd:CITY>Carlsbad</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>92011</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:EMPLID>12345</wd:EMPLID>
<wd:N_BLDG_ID>N</wd:N_BLDG_ID>
<wd:LOCATION_NAME>San Diego</wd:LOCATION_NAME>
<wd:ACTION_EFF_DT>2016-06-27</wd:ACTION_EFF_DT>
<wd:Address_Usage>work</wd:Address_Usage>
<wd:Addresses_group>
<wd:Address_ID>ADDRESS_152</wd:Address_ID>
<wd:ADDRESS1>Remote Office</wd:ADDRESS1>
<wd:CITY>San Diego</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>92121</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:EMPLID>12345</wd:EMPLID>
<wd:N_BLDG_ID>N</wd:N_BLDG_ID>
<wd:LOCATION_NAME>San Diego</wd:LOCATION_NAME>
<wd:ACTION_EFF_DT>2016-06-27</wd:ACTION_EFF_DT>
<wd:Address_Usage>IA</wd:Address_Usage>
<wd:Addresses_group>
<wd:Address_ID>ADDRESS_555</wd:Address_ID>
<wd:ADDRESS1>ABC Office1</wd:ADDRESS1>
<wd:CITY>SleepyTown</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>11223</wd:ZIP>
<wd:COUNTRY>CA</wd:COUNTRY>
</wd:Addresses_group>
</wd:Report_Entry>
</wd:Report_Data>
下面是我的 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:wd="urn:com.abc/bsvc" xmlns:this="this-worksheet" exclude-result-prefixes="xsl"
version="2.0">
<xsl:variable name="vLinefeed" select="'
'"/>
<xsl:variable name="vDelimiter" select="';'"/>
<xsl:template match="/">
<wd:Report_Data>
<xsl:apply-templates select="wd:Report_Data"/>
</wd:Report_Data>
</xsl:template>
<xsl:template match="wd:Report_Data">
<xsl:for-each-group select="wd:Report_Entry" group-by="concat(wd:EMPLID,wd:N_BLDG_ID,wd:LOCATION_NAME)">
<wd:Report_Entry>
<wd:EMPLID>
<xsl:value-of select="wd:EMPLID"/>
</wd:EMPLID>
<wd:N_BLDG_ID>
<xsl:value-of select="wd:N_BLDG_ID"/>
</wd:N_BLDG_ID>
<wd:LOCATION_NAME>
<xsl:value-of select="wd:LOCATION_NAME"/>
</wd:LOCATION_NAME>
<xsl:for-each-group select="current-group()" group-by="wd:Addresses_group">
<xsl:for-each select="wd:Addresses_group">
<wd:Addresses_group>
<wd:EFF_DT>
<xsl:value-of select="../wd:ACTION_EFF_DT"/>
</wd:EFF_DT>
<wd:ADDRESS_TYPE>
<xsl:value-of select="../wd:Address_Usage"/>
</wd:ADDRESS_TYPE>
<wd:ADDRESS1>
<xsl:value-of select="wd:ADDRESS1"/>
</wd:ADDRESS1>
<wd:ADDRESS2>
<xsl:value-of select="wd:ADDRESS2"/>
</wd:ADDRESS2>
<wd:ADDRESS3>
<xsl:value-of select="wd:ADDRESS3"/>
</wd:ADDRESS3>
<wd:CITY>
<xsl:value-of select="wd:CITY"/>
</wd:CITY>
<wd:STATE>
<xsl:value-of select="wd:STATE"/>
</wd:STATE>
<wd:ZIP>
<xsl:value-of select="wd:ZIP"/>
</wd:ZIP>
<wd:COUNTRY>
<xsl:value-of select="wd:COUNTRY"/>
</wd:COUNTRY>
</wd:Addresses_group>
</xsl:for-each>
</xsl:for-each-group>
</wd:Report_Entry>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
下面是当前输出:
<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:wd="urn:com.abc/bsvc"
xmlns:this="this-worksheet">
<wd:Report_Entry>
<wd:EMPLID>12345</wd:EMPLID>
<wd:N_BLDG_ID>N</wd:N_BLDG_ID>
<wd:LOCATION_NAME>San Diego</wd:LOCATION_NAME>
<wd:Addresses_group>
<wd:EFF_DT>1020-01-06</wd:EFF_DT>
<wd:ADDRESS_TYPE>home</wd:ADDRESS_TYPE>
<wd:ADDRESS1>#112233</wd:ADDRESS1>
<wd:ADDRESS2>P.O.Box 222</wd:ADDRESS2>
<wd:ADDRESS3/>
<wd:CITY>Moore</wd:CITY>
<wd:STATE>NJ</wd:STATE>
<wd:ZIP>07945</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:EFF_DT>1020-01-06</wd:EFF_DT>
<wd:ADDRESS_TYPE>home</wd:ADDRESS_TYPE>
<wd:ADDRESS1>123 Good Ave</wd:ADDRESS1>
<wd:ADDRESS2/>
<wd:ADDRESS3/>
<wd:CITY>Carlsbad</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>92011</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:EFF_DT>1020-01-06</wd:EFF_DT>
<wd:ADDRESS_TYPE>home</wd:ADDRESS_TYPE>
<wd:ADDRESS1>#112233</wd:ADDRESS1>
<wd:ADDRESS2>P.O.Box 222</wd:ADDRESS2>
<wd:ADDRESS3/>
<wd:CITY>Moore</wd:CITY>
<wd:STATE>NJ</wd:STATE>
<wd:ZIP>07945</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:EFF_DT>1020-01-06</wd:EFF_DT>
<wd:ADDRESS_TYPE>home</wd:ADDRESS_TYPE>
<wd:ADDRESS1>123 Good Ave</wd:ADDRESS1>
<wd:ADDRESS2/>
<wd:ADDRESS3/>
<wd:CITY>Carlsbad</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>92011</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:EFF_DT>2016-06-27</wd:EFF_DT>
<wd:ADDRESS_TYPE>work</wd:ADDRESS_TYPE>
<wd:ADDRESS1>Remote Office</wd:ADDRESS1>
<wd:ADDRESS2/>
<wd:ADDRESS3/>
<wd:CITY>San Diego</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>92121</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:EFF_DT>2016-06-27</wd:EFF_DT>
<wd:ADDRESS_TYPE>IA</wd:ADDRESS_TYPE>
<wd:ADDRESS1>ABC Office1</wd:ADDRESS1>
<wd:ADDRESS2/>
<wd:ADDRESS3/>
<wd:CITY>SleepyTown</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>11223</wd:ZIP>
<wd:COUNTRY>CA</wd:COUNTRY>
</wd:Addresses_group>
</wd:Report_Entry>
</wd:Report_Data>
我认为不是
<xsl:for-each-group select="current-group()" group-by="wd:Addresses_group">
<xsl:for-each select="wd:Addresses_group">
你想要
<xsl:for-each-group select="current-group()/wd:Addresses_group" group-by=".">
我需要将具有 2 层数据(员工和地址)和具有不同地址的同一员工的多个记录转换为按员工 ID 分组的源 XML。这是 XSL 2.0。下面是我的来源 XML、XSLT 和当前输出。对于具有 2 个地址的第一条记录,输出将 2 个地址复制了两次。我试图将处理 Addresses_group 的 <xsl:for-each>
移动到外循环,但这导致没有数据。需要正确方法的帮助才能做到这一点。谢谢
<?xml version='1.0' encoding='UTF-8'?>
<wd:Report_Data xmlns:wd="urn:com.abc/bsvc">
<wd:Report_Entry>
<wd:EMPLID>12345</wd:EMPLID>
<wd:N_BLDG_ID>N</wd:N_BLDG_ID>
<wd:LOCATION_NAME>San Diego</wd:LOCATION_NAME>
<wd:ACTION_EFF_DT>1020-01-06</wd:ACTION_EFF_DT>
<wd:Address_Usage>home</wd:Address_Usage>
<wd:Addresses_group>
<wd:Address_ID>ADDRESS_REFERENCE-333</wd:Address_ID>
<wd:ADDRESS1>#112233</wd:ADDRESS1>
<wd:ADDRESS2>P.O.Box 222</wd:ADDRESS2>
<wd:CITY>Moore</wd:CITY>
<wd:STATE>NJ</wd:STATE>
<wd:ZIP>07945</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:Address_ID>ADDRESS_REFERENCE-6-444</wd:Address_ID>
<wd:ADDRESS1>123 Good Ave</wd:ADDRESS1>
<wd:CITY>Carlsbad</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>92011</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:EMPLID>12345</wd:EMPLID>
<wd:N_BLDG_ID>N</wd:N_BLDG_ID>
<wd:LOCATION_NAME>San Diego</wd:LOCATION_NAME>
<wd:ACTION_EFF_DT>2016-06-27</wd:ACTION_EFF_DT>
<wd:Address_Usage>work</wd:Address_Usage>
<wd:Addresses_group>
<wd:Address_ID>ADDRESS_152</wd:Address_ID>
<wd:ADDRESS1>Remote Office</wd:ADDRESS1>
<wd:CITY>San Diego</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>92121</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:EMPLID>12345</wd:EMPLID>
<wd:N_BLDG_ID>N</wd:N_BLDG_ID>
<wd:LOCATION_NAME>San Diego</wd:LOCATION_NAME>
<wd:ACTION_EFF_DT>2016-06-27</wd:ACTION_EFF_DT>
<wd:Address_Usage>IA</wd:Address_Usage>
<wd:Addresses_group>
<wd:Address_ID>ADDRESS_555</wd:Address_ID>
<wd:ADDRESS1>ABC Office1</wd:ADDRESS1>
<wd:CITY>SleepyTown</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>11223</wd:ZIP>
<wd:COUNTRY>CA</wd:COUNTRY>
</wd:Addresses_group>
</wd:Report_Entry>
</wd:Report_Data>
下面是我的 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:wd="urn:com.abc/bsvc" xmlns:this="this-worksheet" exclude-result-prefixes="xsl"
version="2.0">
<xsl:variable name="vLinefeed" select="'
'"/>
<xsl:variable name="vDelimiter" select="';'"/>
<xsl:template match="/">
<wd:Report_Data>
<xsl:apply-templates select="wd:Report_Data"/>
</wd:Report_Data>
</xsl:template>
<xsl:template match="wd:Report_Data">
<xsl:for-each-group select="wd:Report_Entry" group-by="concat(wd:EMPLID,wd:N_BLDG_ID,wd:LOCATION_NAME)">
<wd:Report_Entry>
<wd:EMPLID>
<xsl:value-of select="wd:EMPLID"/>
</wd:EMPLID>
<wd:N_BLDG_ID>
<xsl:value-of select="wd:N_BLDG_ID"/>
</wd:N_BLDG_ID>
<wd:LOCATION_NAME>
<xsl:value-of select="wd:LOCATION_NAME"/>
</wd:LOCATION_NAME>
<xsl:for-each-group select="current-group()" group-by="wd:Addresses_group">
<xsl:for-each select="wd:Addresses_group">
<wd:Addresses_group>
<wd:EFF_DT>
<xsl:value-of select="../wd:ACTION_EFF_DT"/>
</wd:EFF_DT>
<wd:ADDRESS_TYPE>
<xsl:value-of select="../wd:Address_Usage"/>
</wd:ADDRESS_TYPE>
<wd:ADDRESS1>
<xsl:value-of select="wd:ADDRESS1"/>
</wd:ADDRESS1>
<wd:ADDRESS2>
<xsl:value-of select="wd:ADDRESS2"/>
</wd:ADDRESS2>
<wd:ADDRESS3>
<xsl:value-of select="wd:ADDRESS3"/>
</wd:ADDRESS3>
<wd:CITY>
<xsl:value-of select="wd:CITY"/>
</wd:CITY>
<wd:STATE>
<xsl:value-of select="wd:STATE"/>
</wd:STATE>
<wd:ZIP>
<xsl:value-of select="wd:ZIP"/>
</wd:ZIP>
<wd:COUNTRY>
<xsl:value-of select="wd:COUNTRY"/>
</wd:COUNTRY>
</wd:Addresses_group>
</xsl:for-each>
</xsl:for-each-group>
</wd:Report_Entry>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
下面是当前输出:
<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:wd="urn:com.abc/bsvc"
xmlns:this="this-worksheet">
<wd:Report_Entry>
<wd:EMPLID>12345</wd:EMPLID>
<wd:N_BLDG_ID>N</wd:N_BLDG_ID>
<wd:LOCATION_NAME>San Diego</wd:LOCATION_NAME>
<wd:Addresses_group>
<wd:EFF_DT>1020-01-06</wd:EFF_DT>
<wd:ADDRESS_TYPE>home</wd:ADDRESS_TYPE>
<wd:ADDRESS1>#112233</wd:ADDRESS1>
<wd:ADDRESS2>P.O.Box 222</wd:ADDRESS2>
<wd:ADDRESS3/>
<wd:CITY>Moore</wd:CITY>
<wd:STATE>NJ</wd:STATE>
<wd:ZIP>07945</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:EFF_DT>1020-01-06</wd:EFF_DT>
<wd:ADDRESS_TYPE>home</wd:ADDRESS_TYPE>
<wd:ADDRESS1>123 Good Ave</wd:ADDRESS1>
<wd:ADDRESS2/>
<wd:ADDRESS3/>
<wd:CITY>Carlsbad</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>92011</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:EFF_DT>1020-01-06</wd:EFF_DT>
<wd:ADDRESS_TYPE>home</wd:ADDRESS_TYPE>
<wd:ADDRESS1>#112233</wd:ADDRESS1>
<wd:ADDRESS2>P.O.Box 222</wd:ADDRESS2>
<wd:ADDRESS3/>
<wd:CITY>Moore</wd:CITY>
<wd:STATE>NJ</wd:STATE>
<wd:ZIP>07945</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:EFF_DT>1020-01-06</wd:EFF_DT>
<wd:ADDRESS_TYPE>home</wd:ADDRESS_TYPE>
<wd:ADDRESS1>123 Good Ave</wd:ADDRESS1>
<wd:ADDRESS2/>
<wd:ADDRESS3/>
<wd:CITY>Carlsbad</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>92011</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:EFF_DT>2016-06-27</wd:EFF_DT>
<wd:ADDRESS_TYPE>work</wd:ADDRESS_TYPE>
<wd:ADDRESS1>Remote Office</wd:ADDRESS1>
<wd:ADDRESS2/>
<wd:ADDRESS3/>
<wd:CITY>San Diego</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>92121</wd:ZIP>
<wd:COUNTRY>US</wd:COUNTRY>
</wd:Addresses_group>
<wd:Addresses_group>
<wd:EFF_DT>2016-06-27</wd:EFF_DT>
<wd:ADDRESS_TYPE>IA</wd:ADDRESS_TYPE>
<wd:ADDRESS1>ABC Office1</wd:ADDRESS1>
<wd:ADDRESS2/>
<wd:ADDRESS3/>
<wd:CITY>SleepyTown</wd:CITY>
<wd:STATE>CA</wd:STATE>
<wd:ZIP>11223</wd:ZIP>
<wd:COUNTRY>CA</wd:COUNTRY>
</wd:Addresses_group>
</wd:Report_Entry>
</wd:Report_Data>
我认为不是
<xsl:for-each-group select="current-group()" group-by="wd:Addresses_group">
<xsl:for-each select="wd:Addresses_group">
你想要
<xsl:for-each-group select="current-group()/wd:Addresses_group" group-by=".">