【问题标题】:BizTalk Mapping Single and Multiple elementsBizTalk 映射单个和多个元素
【发布时间】:2017-03-24 16:28:47
【问题描述】:

我正在尝试通过地图将单个出生名称节点和多个姓氏节点转换为重复的其他姓氏节点。我遇到了一些困难,即当出生名称节点不存在时,多个姓氏节点无法写入。

我已尝试围绕 functoids 进行多种实现,并且 xslt 调用模板似乎都不起作用,只要缺少出生名称就不会输出姓氏元素。

这可以在地图上的 functoids 中完成吗?还是必须通过 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>

【问题讨论】:

  • 考虑包括您尝试过的内容,无论是使用自定义 XSLT 还是使用映射器的屏幕抓取

标签: xslt-1.0 biztalk biztalk-mapper biztalk-2013r2


【解决方案1】:

我认为您的问题可能是由于有一个名称节点,然后是一个也命名为名称的后代节点。这可能会导致您陷入无限循环。这里有一些 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>

【讨论】:

  • 感谢您的回复,由于架构非常大,我正在添加架构的示例 sn-p。
  • 请参阅我使用 XSLT 解决方案修改的先前评论。
  • @Bluewood66 - 我认为他的意思是他需要更多的自定义 XSLT 才能在 BizTalk 中执行此操作。 BizTalk 具有 OOB 可视化映射功能,可以通过额外的 XSLT 进行补充;想出一个他可以使用的通话模板会更有帮助。
【解决方案2】:

您可能可以使用表格循环器来执行此操作,但它的 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>

让birthname 中的name 节点作为第一个参数进入该模板,并将其输出到目标上的Othername 重复节点。

【讨论】:

  • 谢谢,在映射多个姓氏时仍然遇到困难,似乎只能映射出生名。我必须添加 //Subject/multiplesurname 以阻止它在其他父节点(Mother、Farther、Other)中添加每个名称。
【解决方案3】:

在使用 XSLT 调用模板遇到更多困难后,我发现使用 functoids 的解决方案是可能的,并且可以使用来自出生名和复姓的循环 functoids 以及从源节点到目标节点的直接链接的组合来实现。

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2012-11-26
    • 2017-04-01
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多