代码之家  ›  专栏  ›  技术社区  ›  PuffTMD

BizTalk映射按键对人员分组

  •  1
  • PuffTMD  · 技术社区  · 8 年前

    我现有的映射,使用映射中的functoid,基于类型和许多其他逻辑,将人从源架构转换为人从目标架构。随着最近对目标模式的更改,我需要修改转换以使用键(guid)节点,以便我们可以对数据进行分组。

    我想实现一个内联XSLT脚本,用于//Person*/[Key=same]之类的东西,但不确定是否使用XSLT。

    输入示例:

    <Person>
        <PersonType>PartnerParentsFarther</PersonType>
        <Name>
            <title>MR</title>
            <Gender>MALE</Gender>
            ...
        </Name>
        <Address/>
        <PersonKey>
            <Key>a1093c4a-7c53-4de5-ad30-cb4140aec58</Key>
            <ParentKey/>
        </PersonKey>
    </Person>
    <Person>
        <PersonType>PartnerParentsMother</PersonType>
        <Name>
            <title>MRS</title>
            <Gender>FEMALE</Gender>
            ...
        </Name>
        <Address/>
        <PersonKey>
            <Key>a1093c4a-7c53-4de5-ad30-cb4140aec58</Key>
            <ParentKey/>
        </PersonKey>
    </Person>
    <Person>
        <PersonType>PartnerParentsFarther</PersonType>
        <Name>
            <title>MR</title>
            <Gender>MALE</Gender>
            ...
        </Name>
        <Address/>
        <PersonKey>
            <Key>a1093c4a-7c53-4de5-ad30-cb4140aec59</Key>
            <ParentKey/>
        </PersonKey>
    </Person>
    <Person>
        <PersonType>PartnerParentsMother</PersonType>
        <Name>
            <title>MRS</title>
            <Gender>FEMALE</Gender>
            ...
        </Name>
        <Address/>
        <PersonKey>
            <Key>a1093c4a-7c53-4de5-ad30-cb4140aec59</Key>
            <ParentKey/>
        </PersonKey>
    </Person>
    

    当前输出示例:

    <PartnerParents>
        <Father>
            <Title>MR</Title>
            <Gender>MALE</Gender>
        </Father>
        <Father>
            <Title>MR</Title>
            <Gender>MALE</Gender>
        </Father>
        <Mother>
            <Title>MRS</Title>
            <Gender>FEMALE</Gender>
        </Mother>
        <Mother>
            <Title>MRS</Title>
            <Gender>FEMALE</Gender>
        </Mother>
    </PartnerParents>
    

    基于相同键值的所需输出示例:

    <PartnerParents>
        <Father>
            <Title>MR</Title>
            <Gender>MALE</Gender>
        </Father>
        <Mother>
            <Title>MRS</Title>
            <Gender>FEMALE</Gender>
        </Mother>
    </PartnerParents>
    <PartnerParents>
        <Father>
            <Title>MR</Title>
            <Gender>MALE</Gender>
        </Father>
            <Mother>
            <Title>MRS</Title>
            <Gender>FEMALE</Gender>
        </Mother>
    </PartnerParents>
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   user1104946    8 年前

    当此XSLT 1.0解决方案:

    <xsl:key name="groups" match="Test/Person/PersonKey/Key/text()" use="."/>
    
      <xsl:template match="/">
        <xsl:apply-templates select="/Test" />
      </xsl:template>
    
    <xsl:template match="/Test">
    <Test>
      <xsl:for-each select="Person/PersonKey/Key/text()[generate-id()=generate-id(key('groups',.))]">
        <PartnerParents>
          <Father>
            <xsl:for-each select="key('groups',.)">
              <xsl:if test="../../../Name/Gender/text() = 'MALE'">
                <Title>
                   <xsl:value-of select="../../../Name/title/text()" />
                </Title>
                <Gender>
                   <xsl:value-of select="../../../Name/Gender/text()" />
                </Gender>
              </xsl:if>
            </xsl:for-each>
          </Father>
          <Mother>
            <xsl:for-each select="key('groups',.)">
              <xsl:if test="../../../Name/Gender/text() = 'FEMALE'" >
                <Title>
                   <xsl:value-of select="../../../Name/title/text()" />
                </Title>
                <Gender>
                   <xsl:value-of select="../../../Name/Gender/text()" />
                </Gender>
              </xsl:if>
            </xsl:for-each>
           </Mother>
        </PartnerParents >
      </xsl:for-each>
    </Test>
    

    …应用于以下XML:

    <Test>
      <Person>
        <PersonType>PartnerParentsFarther</PersonType>
        <Name>
          <title>MR</title>
           <Gender>MALE</Gender>
        </Name>
        <Address/>
        <PersonKey>
          <Key>a1093c4a-7c53-4de5-ad30-cb4140aec58</Key>
          <ParentKey/>
        </PersonKey>
     </Person>
     <Person>
       <PersonType>PartnerParentsMother</PersonType>
       <Name>
         <title>MRS</title>
         <Gender>FEMALE</Gender>
       </Name>
       <Address/>
       <PersonKey>
          <Key>a1093c4a-7c53-4de5-ad30-cb4140aec58</Key>
          <ParentKey/>
       </PersonKey>
     </Person>
     <Person>
       <PersonType>PartnerParentsFarther</PersonType>
       <Name>
         <title>MR</title>
         <Gender>MALE</Gender>
       </Name>
       <Address/>
       <PersonKey>
        <Key>a1093c4a-7c53-4de5-ad30-cb4140aec59</Key>
        <ParentKey/>
     </PersonKey>
     </Person>
     <Person>
      <PersonType>PartnerParentsMother</PersonType>
      <Name>
        <title>MRS</title>
        <Gender>FEMALE</Gender>
      </Name>
      <Address/>
       <PersonKey>
         <Key>a1093c4a-7c53-4de5-ad30-cb4140aec59</Key>
         <ParentKey/>
       </PersonKey>
     </Person>
    </Test>
    

    …产生所需结果:

    <Test>
     <PartnerParents>
       <Father>
         <Title>MR</Title>
         <Gender>MALE</Gender>
       </Father>
       <Mother>
        <Title>MRS</Title>
        <Gender>FEMALE</Gender>
       </Mother>
     </PartnerParents>
     <PartnerParents>
       <Father>
         <Title>MR</Title>
         <Gender>MALE</Gender>
       </Father>
       <Mother>
         <Title>MRS</Title>
         <Gender>FEMALE</Gender>
       </Mother>
     </PartnerParents>
    </Test>