BizTalk 映射单个和多个元素

BizTalk Mapping Single and Multiple elements

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

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

这可以在地图的 functoid 中完成吗?还是必须通过 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 代码,可以为您完成这项工作。

  <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>

您可能可以使用 table 循环器来完成此操作,但它的 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 重复节点。

在 运行 遇到 XSLT 调用模板的进一步困难之后,我发现使用 functoid 的解决方案是可能的,并且使用 birthname 和 multiplesurname 中的循环 functoid 以及直接 link 的组合来实现源节点到目的节点。