用于BizTalk映射的XSLT和更改节点名称

时间:2016-03-15 21:10:17

标签: xslt-1.0 biztalk biztalk-2013

我需要将2个字段从大型架构映射到小型架构(下图),以生成要发送以进行Web服务调用的消息。

<xs:element name="ds">
     <xs:complexType>
         <xs:sequence>
             <xs:element name="ID" type="xs:string"></xs:element>
             <xs:element name="d1" type="xs:string"></xs:element>
         </xs:sequence>
     </xs:complexType>
 </xs:element>

使用相同的Web方法更新许多不同的项目,因此包含2个参数:ID和另一个通用更新字段,它将获取更新的文本值。

ID参数始终称为ID,但根据我必须更新的项目类型,第二个参数将更改其名称。

所以,在BizTalk地图中(我猜测应该是XSLT): 映射到的第一个字段是一个ID字段,从源中的TargetID到目标中的ID。这是一个直接映射。 第二个字段将始终映射到名为“d1”的字段。 基于xsl:if,d1的节点名称将更改。 例如:

如果大型架构中的changeType ='forename',则d1将变为d_forename

如果大型架构中的changeType ='surname',则d1将成为d_surname,依此类推。

将会有大约20种可能的changeTypes,所以我想我的问题是,如果我使用xsl:选择评估changeType(它会给我我的ID和更新值)我怎样才能同时返回<d1>节点的新名称?我知道这将是一个名为模板,但不确定从哪里开始。

1 个答案:

答案 0 :(得分:1)

您正在寻找的是元素命名的可能性。

大部分时间会发生以下情况:

<d_someOtherNode>
  <xsl:value-of select="/root/someOtherNode/text()" />
</d_someOtherNode>

但是,您还可以做的是:

<xs:element name="{concat('d_', name(/root/someOtherNode))}">
      <xsl:value-of select="/root/someOtherNode/text()" />
</xs:element>

后者允许您根据需要命名元素,在这种情况下,连接d_和您需要的元素的名称(someOtherNode)。

将其置于“if”结构中,或根据您的解决方案选择/何时结构。