BizTalk Mapping Одиночные и множественные элементы

Я пытаюсь преобразовать с помощью карты один узел имени рождения и несколько узлов фамилии в повторяющиеся другие узлы фамилии. Я сталкиваюсь с некоторыми трудностями, когда узел имени при рождении отсутствует, тогда несколько узлов фамилии не могут быть записаны.

Я пробовал несколько реализаций вокруг функтоидов, и шаблон вызова xslt не работает, как только отсутствует имя при рождении, никакие элементы фамилии не выводятся.

Можно ли это сделать в функтоидах с карты? или это нужно делать через шаблон вызова xslt?

Ввод схемы

<root>
  <Subject>
    <birthname>
      <name>Birthname</name>
    </birthname>
    <multiplesurname>
      <name>surname</name>
    </multiplesurname>
    <multiplesurname>
      <name>surname2</name>
    </multiplesurname>
    <multiplesurname>
      <name>surname3</name>
    </multiplesurname>
  </Subject>
  <Mother></Mother>
  <Farther></Farther>
  <Other></Other>
</root>

Вывод схемы

<root>
  <persona>
    <Othername>Birthname</Othername>
    <Othername>surname</Othername>
    <Othername>surname2</Othername>
    <Othername>surname3</Othername>
  </persona>
  <personb></personb>
</root>

person PuffTMD    schedule 15.02.2017    source источник
comment
Рассмотрите возможность включения того, что вы пробовали, будь то с помощью пользовательского XSLT или снимка экрана картографа.   -  person Dan Field    schedule 17.02.2017


Ответы (3)


Я думаю, что ваши проблемы могут быть вызваны наличием узла имени, а затем узла-потомка, также названного именем. Это может вызвать бесконечный цикл для вас. Вот код XSLT, который сделает всю работу за вас.

  <xsl:template match="name">
    <xsl:copy>
      <xsl:apply-templates select=".//name" mode="secondName"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="name" mode="secondName">
    <xsl:element name="Othername">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

   <!-- Identity. -->
   <xsl:template match="@* | node()">
     <xsl:copy>
       <xsl:apply-templates select="@* | node()"/>
     </xsl:copy>
   </xsl:template>
person Bluewood66    schedule 15.02.2017
comment
Спасибо за ваш ответ, я добавлял пример фрагмента схемы, так как схема очень большая. - person PuffTMD; 16.02.2017
comment
См. предыдущий комментарий, который я исправил с помощью решения XSLT. - person Bluewood66; 16.02.2017
comment
@Bluewood66 Bluewood66. Я думаю, он имеет в виду, что ему потребуется гораздо больше пользовательских XSLT, чтобы сделать это в BizTalk. BizTalk имеет функцию визуального сопоставления OOB, которую можно дополнить дополнительным XSLT; было бы полезнее придумать шаблон звонка, который он мог бы использовать. - person Dan Field; 17.02.2017

Вероятно, вы могли бы сделать это с помощью циклического зацикливания таблиц, но шаблон вызова XSLT для него не должен быть слишком плохим — что-то вроде этого должно работать для вас:

<xsl:template name="nameFlattener">
    <xsl:param name="birthname"/>
    <xsl:element name="Othername">
        <xsl:value-of select="$birthname"/>
    </xsl:element>
    <xsl:for-each select="//multiplesurname">
        <xsl:element name="Othername">
            <xsl:value-of select="name"/>
        </xsl:element>
    </xsl:for-each>
</xsl:template>

Пусть ваш узел name из birthname входит в этот шаблон в качестве первого параметра и выводит его на повторяющийся узел Othername в месте назначения.

person Dan Field    schedule 17.02.2017
comment
Спасибо, все еще возникают трудности с сопоставлением нескольких фамилий, кажется, только сопоставление имени при рождении. Мне пришлось добавить //Subject/multiplesurname, чтобы он не добавлял каждое имя в другие родительские узлы (Mother, Farther, Other). - person PuffTMD; 20.02.2017

Столкнувшись с дальнейшими трудностями с шаблоном вызова XSLT, я обнаружил, что решение с использованием функтоидов возможно и достигается с помощью комбинации циклических функтоидов от имени рождения и множественной фамилии вместе с прямой связью от исходного узла к целевому узлу.

person PuffTMD    schedule 24.03.2017