在Joint XSLT中根据文档子类型选择地图

时间:2018-03-12 11:47:42

标签: xml xslt biztalk canonical-schema

我创建了两个单独的地图,每个地图都有一个CDM模式的来源。我现在必须创建第三个映射,它应该根据子类型(标题中的字段元素)选择要使用的正确映射。

现在我创建了一个Joint.xslt文件,它包含选择和使用正确映射所需的逻辑。

在我的场景中:如果子类型是'发票',则应使用一个特定的地图。如果子类型是' ConsolidatedInvoice',则应使用其他地图。

我考虑过使用xsl:if元素对子类型进行测试:

<xsl:variable name="var:InvoiceSubType" select="string(Header/InvoiceType/text())" />
<xsl:if test="$var:InvoiceSubType = 'Invoice'">
...use invoice map
</xsl:if>

但我不确定正确的方法。在组合来自两个映射的XSLT时,许多变量名称例如被复制并导致联合XSLT中的错误。

要使用联合地图,我已将其选为地图属性中的自定义XSLT路径,而源模式是CDM。

如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:1)

嗯...... 不要这样做。 ;;)虽然XSL支持选择模板,但它会破坏Mapper。

正确的BizTalk方式是使用Mapper作为您的Invoice和ConsolidatedInvoice Map,就像您已经完成的那样,然后决定在地图之外应用哪些,例如 Orchestration

为此添加或使用Orchestration没有任何问题。不要担心“性能”。

另一个选项是推荐属性,发送端口过滤器和Loopback Adapter

答案 1 :(得分:0)

您可以在Joint.xsl中使用XSLT的 xsl:include和xsl:import机制来同时使用它们。

然后你可以实现xsl:template来应用地图:

<xsl:template match="Header[contains(InvoiceType,'Invoice')]">
    ...
</xsl>

<xsl:template match="Header[contains(InvoiceType,'ConsolidatedInvoice')]">
    ...
</xsl>