BizTalk强制在不使用xslt调用模板的情况下创建空元素

时间:2010-11-03 15:04:03

标签: biztalk

在没有使用xslt调用模板的情况下,当源元素不存在时,BizTalk映射中是否存在强制目标元素的创建?

我将父/子xml映射到wcf-sql适配器生成的模式,该模式具有存储过程参数的表值参数。

所以我的源xml是:

<Category>
  <CategoryId>1</CategoryId>
  <CategoryName>Test</CategoryName>
</Category>

和/或带媒体的类别

<Category>
  <CategoryId>1</CategoryId>
  <CategoryName>Test</CategoryName>
  <Media>
    <Medium>
      <MediumId>1</MediumId>
      <MediumName>test.jpg</MediumName>
    </Medium>
  </Media>
</Category>

TypedProcedure的架构类似于:

<ImportCategoryRequest>
  <Category>
    <CategoryId>1</CategoryId>
    <CategoryName>Test</CategoryName>
  </Category>
  <Media>
    <Medium>
      <MediumId>1</MediumId>
      <MediumName>test.jpg</MediumName>
    </Medium>
  </Media>
</ImportCategoryRequest>

因此,当目标XML中显示所有内容时,它不喜欢它。它不需要为表值参数传递null,而是需要至少1行并为tvp中的列传递空值。我可以使用xslt调用模板创建虚拟xml,但我想避免这种情况。

1 个答案:

答案 0 :(得分:3)

BizTalk映射器似乎使用<xsl:for-each>,因此如果没有输入,则不会生成输出元素。

但是使用xslt非常简单 - 请参阅here如何从现有地图中删除xslt(并删除双引号和斜线周围的转义),并将地图更改为自定义XSLT。

你需要改变的一点就是媒体就像:

        <xsl:choose>
            <xsl:when test="count(ns0:Media)!=0">
                <!-- Copy the mapper generated XSLT in the for each here-->
                <xsl:foreach >
                    </xsl:for-each>
                </xsl:when>
            <xsl:otherwise>
                <Media>
                    <Medium>
                        <MediumId>1</MediumId>
                        <MediumName>test.jpg</MediumName>
                    </Medium>
                </Media>
            </xsl:otherwise>
        </xsl:choose>