BizTalk Map Группировка лиц по ключам

Моя существующая карта преобразует человека из исходной схемы в человека из целевой схемы с использованием функтоидов на карте на основе типа и ряда других логических схем. С недавним изменением схемы назначения мне нужно изменить преобразование, чтобы использовать ключевой (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>

person PuffTMD    schedule 22.03.2016    source источник
comment
Похоже, это групповой вопрос. См .: jenitennison.com/xslt/grouping/muenchian.html   -  person michael.hor257k    schedule 22.03.2016


Ответы (1)


Когда это решение 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>

...is applied to the below 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>
person user1104946    schedule 24.03.2016
comment
Оказывается, в некоторых данных не будет ключа, поэтому мне нужно обеспечить отображение данных там, где нет сопоставления ключей. В настоящее время я проверяю родительский ключ = '', но мне нужно решить, как добавить его в шаблон в соответствии с другими комбинациями родительского ключа и пары ключей. - person PuffTMD; 17.07.2016