我有以下XML
`<?xml version="1.0" encoding="UTF-8"?>
<resultSet>
<row>
<ACCT_NO>79501</ACCT_NO>
<PVT_CHOICE_CD>C1</PVT_CHOICE_CD>
<PVT_STATUS>O</PVT_STATUS>
<OVEERRIDE_STATUS />
<EFFCTV_DATE>2009-11-24 01:58:06.000001</EFFCTV_DATE>
<PREF_PROVIDER />
<DEST_EML_ADDR>TEST1.TEST1@XYZ.COM</DEST_EML_ADDR>
<EML_PVT_TYPE_CD>O</EML_PVT_TYPE_CD>
<REP_ID />
<OVERD_RSN_CD />
<OVERD_DESC />
<OVERD_EFF_TS />
</row>
<row>
<ACCT_NO>79501</ACCT_NO>
<PVT_CHOICE_CD>D1</PVT_CHOICE_CD>
<PVT_STATUS>O</PVT_STATUS>
<OVEERRIDE_STATUS />
<EFFCTV_DATE>2013-11-24 01:58:06.000001</EFFCTV_DATE>
<PREF_PROVIDER />
<DEST_EML_ADDR>TEST1.TEST1@XYZ.COM</DEST_EML_ADDR>
<EML_PVT_TYPE_CD>O</EML_PVT_TYPE_CD>
<REP_ID />
<OVERD_RSN_CD />
<OVERD_DESC />
<OVERD_EFF_TS />
</row>
<row>
<ACCT_NO>79500</ACCT_NO>
<PVT_CHOICE_CD>D1</PVT_CHOICE_CD>
<PVT_STATUS>O</PVT_STATUS>
<OVEERRIDE_STATUS />
<EFFCTV_DATE>2012-12-23 00:12:23.000001</EFFCTV_DATE>
<PREF_PROVIDER />
<DEST_EML_ADDR>TEST2.TEST2@XYZ.COM </DEST_EML_ADDR>
<EML_PVT_TYPE_CD>O</EML_PVT_TYPE_CD>
<REP_ID />
<OVERD_RSN_CD />
<OVERD_DESC />
<OVERD_EFF_TS />
</row>
</resultSet>`
此resultSet来自数据库调用,它表示卡帐户与其首选项代码之间的多对多关系。卡可能与电子邮件关联 - (DEST_EML_ADDR)和电子邮件选择(EML_PVT_TYPE_CD),这两个标签对于多行中的相同卡号也具有相同的值。该卡还将具有唯一的首选项代码和一组与首选项相关的信息,这些信息对于每一行都是唯一的。
我的目标是拉出每个唯一的卡号,dest_email_addr和eml_pvt_type_cd,并将所有与偏好相关的信息与每个帐户的一个块中的信息相关联。
总之,上述输入的所需输出为:
<?xml version="1.0" encoding="UTF-8"?>
<EntityResponse>
<EntityDetails>
<ACCT_NO>79501 </ACCT_NO>
<DEST_EML_ADDR>TEST1.TEST1@XYZ.COM </DEST_EML_ADDR>
<EML_PVT_TYPE_CD>O</EML_PVT_TYPE_CD>
<PreferenceGroup>
<PreferenceDetails>
<PVT_CHOICE_CD>C1</PVT_CHOICE_CD>
<PVT_STATUS>O</PVT_STATUS>
<OVEERRIDE_STATUS />
<EFFCTV_DATE>2009-11-2401:58:06.000001</EFFCTV_DATE>
<PREF_PROVIDER />
<REP_ID />
<OVERD_RSN_CD />
<OVERD_DESC />
<OVERD_EFF_TS />
</PreferenceDetails>
<PreferenceDetails>
<PVT_CHOICE_CD>D1</PVT_CHOICE_CD>
<PVT_STATUS>O</PVT_STATUS>
<OVEERRIDE_STATUS />
<EFFCTV_DATE>2013-11-24 01:58:06.000001</EFFCTV_DATE>
<PREF_PROVIDER />
<REP_ID />
<OVERD_RSN_CD />
<OVERD_DESC />
<OVERD_EFF_TS />
</PreferenceDetails>
</PreferenceGroup>
</EntityDetails>
<EntityDetails>
<ACCT_NO>79500</ACCT_NO>
<DEST_EML_ADDR>TEST2.TEST2@XYZ.COM</DEST_EML_ADDR>
<EML_PVT_TYPE_CD>O</EML_PVT_TYPE_CD>
<PreferenceGroup>
<PreferenceDetails>
<PVT_CHOICE_CD>D1</PVT_CHOICE_CD>
<PVT_STATUS>O</PVT_STATUS>
<OVEERRIDE_STATUS />
<EFFCTV_DATE>2012-12-23 00:12:23.000001</EFFCTV_DATE>
<PREF_PROVIDER />
<REP_ID />
<OVERD_RSN_CD />
<OVERD_DESC />
<OVERD_EFF_TS />
</PreferenceDetails>
</PreferenceGroup>
</EntityDetails>
</EntityResponse>
我被限制使用XSLT 1.0,在阅读了这个Muenchian method grouping based on multiple keys线程后,我意识到这也是我需要的解决方案。根据这些信息,我创建了以下XSL,在其中我使用ACCT_NO,DEST_EML_ADDR和EML_PVT_TYPE_CD创建密钥以过滤掉唯一元素,并基于第二个密钥应用第二个模板,以进一步对一对多首选项代码关系进行分组:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="entity-email-key" match="row" use="concat(ACCT_NO,'~#~',DEST_EML_ADDR, '~#~',EML_PVT_TYPE_CD)"/>
<xsl:key name="prefcd-key" match="row" use="concat(ACCT_NO,'~#~',DEST_EML_ADDR, '~#~',EML_PVT_TYPE_CD, '~#~',PVT_CHOICE_CD)"/>
<xsl:template match="/resultSet">
<EntityResponse>
<xsl:apply-templates select="row[generate-id() = generate-id(key('entity-email-key', concat(ACCT_NO,'~#~',DEST_EML_ADDR, '~#~',EML_PVT_TYPE_CD))[1])]" mode="entity-email-key"/>
</EntityResponse>
</xsl:template>
<xsl:template match="row" mode="entity-email-key">
<EntityDetails>
<xsl:copy-of select="ACCT_NO|PVT_STATUS|DEST_EML_ADDR|EML_PVT_TYPE_CD"/>
<PreferenceGroup>
<xsl:apply-templates select="key('entity-email-key', concat(ACCT_NO,'~#~',DEST_EML_ADDR, '~#~',EML_PVT_TYPE_CD))[generate-id() = generate-id(key('prefcd-key', concat(ACCT_NO,'~#~',DEST_EML_ADDR, '~#~',EML_PVT_TYPE_CD,PVT_CHOICE_CD))[1])]" mode="prefcd-key"/>
</PreferenceGroup>
</EntityDetails>
</xsl:template>
<xsl:template match="row" mode="prefcd-key">
<PreferenceDetails>
<xsl:copy-of select="PVT_CHOICE_CD|PVT_STATUS|OVEERRIDE_STATUS|EFFCTV_DATE|PREF_PROVIDER|REP_ID|OVERD_RSN_CD|OVERD_DESC|OVERD_EFF_TS"/>
</PreferenceDetails>
</xsl:template>
</xsl:stylesheet>
但是当我运行代码时,我意识到它只是由ACCT_NO,EMAIL和EML_PVT_TYPE_CD组成,但却未能通过偏好代码相关标签进行分组。我尝试了选择偏好代码数据的不同组合,我能得到的最接近的是每张卡都有一个偏好代码,但偏好代码可能不止一个,因为第一张卡的情况就是如此 - 它有两个独特的偏好代码相关数据。
所以我认为我对这个方法还没有很好的理解,也许我甚至不需要定义第二个键,但经过几天的摔跤这个问题后,是时候转向社区看看我错过了什么。
谢谢!
答案 0 :(得分:1)
在您的问题中查看XSLT,当您使用~#~
密钥时,您在concat语句中的最终PVT_CHOICE_CD
之前错过了分隔符prefcd-key
:
请改为尝试:
<xsl:apply-templates select="key('entity-email-key', concat(ACCT_NO,'~#~',DEST_EML_ADDR, '~#~',EML_PVT_TYPE_CD))
[generate-id() = generate-id(key('prefcd-key', concat(ACCT_NO,'~#~',DEST_EML_ADDR, '~#~',EML_PVT_TYPE_CD, '~#~', PVT_CHOICE_CD))[1])]"
mode="prefcd-key"/>