【问题标题】:XSLT 1.0 grouping with Muenchian methodXSLT 1.0 使用 Muenchian 方法进行分组
【发布时间】:2015-07-30 15:13:45
【问题描述】:


我有以下 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>`

此结果集来自数据库调用,它表示卡帐户与其偏好代码之间的多对多关系。一张卡可能与一个电子邮件 - (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 分组,但未能按偏好代码相关标签分组。我尝试了选择偏好代码数据的不同组合,我能得到的最接近的方法是为每张卡设置一个偏好代码,但偏好代码可能不止一个,因为第一张卡就是这种情况——它有两个唯一的偏好代码相关数据。

所以我认为我对这个方法还不是很了解,也许我什至不需要定义第二个密钥但是在与这个问题搏斗了几天之后,是时候转向社区看看了我错过了什么。
谢谢!

【问题讨论】:

    标签: xslt xslt-1.0 muenchian-grouping


    【解决方案1】:

    查看问题中的 XSLT,当您使用 prefcd-key 键时,您在 concat 语句中的最后一个 PVT_CHOICE_CD 之前错过了分隔符 ~#~

    试试这个:

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

    【讨论】:

    • 这对蒂姆有效。现在,我正试图弄清楚如何才能对您的答案进行投票,并且是全新的。谢谢。
    • @MehmetAliAtlihan 要投票,您至少需要 15 个声望。不过,您可以通过勾选它来接受答案。
    猜你喜欢
    • 2018-03-28
    • 2021-11-20
    • 2019-12-07
    • 1970-01-01
    • 2018-06-24
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多