BizTalk XSLT Mapping для группировки и сортировки с несколькими записями - PullRequest
0 голосов
/ 24 января 2019

Входное сообщение:

Входной файл содержит три записи внутри детали в следующем порядке: «Элемент», «Продукт» и «Зависимый». В каждой записи есть общее поле «Идентификатор». По какой-то причине мы становимся похожими на каждого члена и Продукт зацикливается на одну деталь, а каждый зависимый - на отдельную деталь .................................................. ..............................

    <ns0:Root xmlns:ns0="Test">
  <Detail>
    <Member>
      <Name>Jerry</Name>
      <Address>Miami</Address>
      <PhoneNumber>7008084201</PhoneNumber>
      <Identifier>225692067</Identifier>
    </Member>
    <Product>
      <Name>Phone</Name>
      <Type>Personal</Type>
      <Serial>000000111111</Serial>
      <Identifier>225692067</Identifier>
    </Product>
  </Detail>
  <Detail>
    <Dependent>
      <DependentName>Tom</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
  </Detail>
  <Detail>
    <Dependent>
      <DependentName>Tom1</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>8228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
  </Detail>
  <Detail>
    <Dependent>
      <DependentName>Tom2</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>9228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
  </Detail>
  <Detail>
    <Member>
      <Name>John</Name>
      <Address>Kansas</Address>
      <PhoneNumber>5007684306</PhoneNumber>
      <Identifier>699039521</Identifier>
    </Member>
    <Product>
      <Name>Xbox</Name>
      <Type>Personal</Type>
      <Serial>000000222222</Serial>
      <Identifier>699039521</Identifier>
    </Product>
  </Detail>
  <Detail>
    <Member>
      <Name>Larry</Name>
      <Address>Newjersey</Address>
      <PhoneNumber>6004567307</PhoneNumber>
      <Identifier>230903815</Identifier>
    </Member>
    <Product>
      <Name>Iphone</Name>
      <Type>Personal</Type>
      <Serial>0000003333333</Serial>
      <Identifier>230903815</Identifier>
    </Product>
  </Detail>
  <Detail>
    <Dependent>
      <DependentName>Luis</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7897684302</DependentPhoneNumber>
      <Identifier>230903815</Identifier>
    </Dependent>
  </Detail>
  <Detail>
    <Dependent>
      <DependentName>LuisMead</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7229876302</DependentPhoneNumber>
      <Identifier>230903815</Identifier>
    </Dependent>
  </Detail>
</ns0:Root>

Ожидаемый выходной XML:

Файл OutPut также аналогичен входному файлу, но имеет порядок «Элемент», «Зависимый» и «Продукт». Общее поле «Идентификатор» также является общим в этом случае. Идея состоит в том, чтобы сделать детальный цикл в порядке «Элемент», «Зависимый» и «Продукт». .................................................. ....................................

    <ns0:Root xmlns:ns0="Test">
  <Detail>
    <Member>
      <Name>Jerry</Name>
      <Address>Miami</Address>
      <PhoneNumber>7008084201</PhoneNumber>
      <Identifier>225692067</Identifier>
    </Member>

    <Dependent>
      <DependentName>Tom</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
    <Dependent>
      <DependentName>Tom1</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>8228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
    <Dependent>
      <DependentName>Tom2</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>9228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
    <Product>
      <Name>Phone</Name>
      <Type>Personal</Type>
      <Serial>000000111111</Serial>
      <Identifier>225692067</Identifier>
    </Product>
  </Detail>
  <Detail>
    <Member>
      <Name>John</Name>
      <Address>Kansas</Address>
      <PhoneNumber>5007684306</PhoneNumber>
      <Identifier>699039521</Identifier>
    </Member>
    <Product>
      <Name>Xbox</Name>
      <Type>Personal</Type>
      <Serial>000000222222</Serial>
      <Identifier>699039521</Identifier>
    </Product>
  </Detail>
  <Detail>
    <Member>
      <Name>Larry</Name>
      <Address>Newjersey</Address>
      <PhoneNumber>6004567307</PhoneNumber>
      <Identifier>230903815</Identifier>
    </Member>

    <Dependent>
      <DependentName>Luis</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7897684302</DependentPhoneNumber>
      <Identifier>230903815</Identifier>
    </Dependent>
    <Dependent>
      <DependentName>LuisMead</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7229876302</DependentPhoneNumber>
      <Identifier>230903815</Identifier>
    </Dependent>
    <Product>
      <Name>Iphone</Name>
      <Type>Personal</Type>
      <Serial>0000003333333</Serial>
      <Identifier>230903815</Identifier>
    </Product>
  </Detail>

</ns0:Root>

Для этого нужно предложение по написанию кода XSLT 1.0.

1 Ответ

0 голосов
/ 24 января 2019

Вы можете сделать это в XSLT-1.0 с помощью Muenchian Grouping . Ищите его в StackOverflow, и вы найдете много примеров. Применяя его, мы получили следующий ответ:

  • Создайте xsl:key с узлами Member|Dependent|Product, используя его значение элемента Identifier в качестве ключа
  • Создать переменную sortingOrder , которая предоставляет индексы для сортировки записей во внутреннем xsl:for-each
  • Сопоставьте и скопируйте корневой узел /ns0:Root с шаблоном
  • Зацикливание на всех дочерних элементах Detail элементов в xsl:for-each. В выражении применяется метод мюнхенской группировки
  • Создание элементов Detail и цикл по результатам предыдущего xsl:for-each, отсортированного по индексу вхождения имени текущего элемента в переменную sortingOrder . Скопируйте его содержание. Метод упорядочения элементов был взят из этого ответа SO: «Сортировка XML в XSLT на основе списка значений» .

Таблица стилей может выглядеть следующим образом:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="Test">
<xsl:output indent="yes"/>
<xsl:key name="id" match="Member|Dependent|Product" use="Identifier" />   
<xsl:variable name="sortingOrder" select="'Member,Dependent,Product'" />

<xsl:template match="/ns0:Root">
    <xsl:copy>
        <xsl:for-each select="Detail/*[generate-id() = generate-id(key('id',Identifier)[1])]">
            <Detail>
                <xsl:for-each select="key('id',Identifier)">
                    <xsl:sort data-type="number" select="string-length(substring-before($sortingOrder,local-name()))" />
                    <xsl:copy-of select="."/>
                </xsl:for-each>
            </Detail>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Вывод должен быть желаемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...