BizTalk映射单个和多个元素

时间:2017-02-15 08:24:24

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

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

我尝试围绕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>

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以使用表循环器执行此操作,但是它的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的{​​{1}}节点作为第一个参数进入该模板,并将其输出到目的地的birthname重复节点。

答案 2 :(得分:0)

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