Xslt 1.0 BizTalk映射单个和多个元素

Xslt 1.0 BizTalk映射单个和多个元素,xslt-1.0,biztalk,biztalk-mapper,biztalk-2013r2,Xslt 1.0,Biztalk,Biztalk Mapper,Biztalk 2013r2,我试图通过映射将单个出生名节点和多个姓氏节点转换为重复的其他姓氏节点。我遇到了一些困难,当出生名节点不存在时,多个姓氏节点无法写入 我尝试了多个functoid和xslt调用模板的实现,但这两个实现似乎都不起作用,只要出生名丢失,就不会输出姓氏元素 这可以在地图的functoid中完成吗?或者这必须通过xslt调用模板来完成 模式输入 出生名 姓 姓2 姓3 模式输出 出生名 姓 姓2 姓3 我认为您的问题可能是由一个名节点和一个名为name的后代节点引起的。这可能会给您造成无限循环。下面

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

我尝试了多个functoid和xslt调用模板的实现,但这两个实现似乎都不起作用,只要出生名丢失,就不会输出姓氏元素

这可以在地图的functoid中完成吗?或者这必须通过xslt调用模板来完成

模式输入

出生名
姓
姓2
姓3
模式输出

出生名
姓
姓2
姓3

我认为您的问题可能是由一个名节点和一个名为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>

您可能可以使用表循环器来实现这一点,但它的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以及从源节点到目标节点。

感谢您的回复,我添加了一个模式的示例片段,因为该模式非常大。请参阅我使用XSLT解决方案修改的上一条评论。@Bluewood66-我想他的意思是,他需要更多的自定义XSLT才能在BizTalk中执行此操作。BizTalk具有OOB可视映射功能,可通过附加XSLT进行补充;想出一个他可以使用的调用模板会更有用。考虑包括你尝试过的,无论是用自定义XSLT还是MpPurress的屏幕抓取,仍然存在映射多个URL名称的困难,似乎只有地图的名字。我必须添加//Subject/multiplesurname以阻止它在其他父节点(母亲节点、更远节点、其他节点)中添加每个名称。
  <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>
<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>