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

XSLT for BizTalk mapping and changing node name

我需要将 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>

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

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

因此,在 BizTalk 映射中(我猜应该是 XSLT): 映射的第一个字段是 ID 字段,从源中的 TargetID 到目标中的 ID。这是一个直接映射。 第二个字段将始终映射到名为 'd1' 的字段。 基于一个xsl:if,d1的节点名称会发生​​变化。 例如:

if changeType in large schema = 'forename', d1 将变为 d_forename

如果大型模式中的 changeType = 'surname',d1 将变为 d_surname 等等。

大约有 20 种可能的 changeType,所以我想我的问题是,如果我使用 xsl:choose 来评估 changeType(这将给我我的 ID 和更新值)我怎么能在同时return节点的新名称为<d1>?我知道这将是一个被调用的模板,但不确定从哪里开始。

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

大多数时候发生的情况如下:

<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" 结构或 choose/when 结构中。