2012-06-14 2 views
2

У меня проблема с отображением, которую я пытаюсь решить в инструменте сопоставления BizTalk.Проблема с отображением BizTalk

Рассмотрим следующий входной файл:

<person> 
    <ID>APersonID</ID> 
    <relatives> 
     <relative> 
      <name>Relative name 1</name> 
     </relative> 
     <relative> 
      <name>Relative name 2</name> 
     </relative> 
    </relatives> 
</person> 

Примечание: MinOccurs относительного элемента установлен в и MaxOccurs относительного элемента устанавливается в неограниченной.

Этот вход должен быть отображен на следующий вывод:

<relatives> 
    <person> 
     <ID>APersonID</ID> 
     <relative>Relative name 1</relative> 
    </person> 
    <person> 
     <ID>APersonID</ID> 
     <relative>Relative name 2</relative> 
    </person> 
<relatives> 

Примечание: Лицо элемент имеет MinOccurs из и А MaxOccurs из неограниченной.

У меня есть сопоставление с функцией Looping functoid, которая связывает относительный элемент входного файла с элементом person в выходном файле. Но теперь возникает ситуация, когда мне предоставляется следующий входной файл :

<person> 
    <ID>APersonID</ID> 
    <relatives /> 
</person> 

Какой должно быть отображено в

<relatives> 
    <person> 
     <ID>APersonID</ID> 
    </person> 
<relatives> 

Моего текущего отображения не может справиться с этой ситуацией. Может ли кто-нибудь дать предложения о том, как сделать/отредактировать картографию, чтобы обе ситуации могли работать?

ответ

3

Это немного сложнее, чем кажется на первый взгляд, так как нам нужно протестировать существование хотя бы одного relatives/relative перед прогрессированием. Я не могу думать ни о каком другом способе, как использовать XSLT - см. here о том, как извлечь XSLT с вашей карты и изменить BTM, чтобы использовать XSLT вместо отображения визуальной функции.

Следующая XSLT

<?xml version="1.0" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" 
    exclude-result-prefixes="msxsl var" 
    version="1.0" 
    xmlns:ns0="http://BizTalk_Server_Project5.Schema1"> 
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" /> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="/ns0:person" /> 
    </xsl:template> 
    <xsl:template match="/ns0:person"> 
     <relatives> 
      <xsl:variable name="personId" select="ns0:ID/text()" /> 
      <xsl:choose> 
       <xsl:when test="not(ns0:relatives) or not(ns0:relatives/ns0:relative)"> 
        <person> 
         <ID> 
          <xsl:value-of select="$personId" /> 
         </ID> 
        </person> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:for-each select="ns0:relatives/ns0:relative"> 
         <person> 
          <ID> 
           <xsl:value-of select="$personId" /> 
          </ID> 
          <relative> 
           <xsl:value-of select="ns0:name/text()" /> 
          </relative> 
         </person> 
        </xsl:for-each> 
       </xsl:otherwise> 
      </xsl:choose> 
     </relatives> 
    </xsl:template> 
</xsl:stylesheet> 

Производит вывод, который вы описали. (Очевидно, измените ваши пространства имен, чтобы они совпадали, и я предположил, что у вас есть elementFormDefault="qualified" (Если нет, отбросьте префиксы ns0)

+1

Привет, благодарю вас за ваш ответ, так как пользовательский XSLT решил мою проблему. – Casper