我处理BizTalk映射,并制作了一个XSLT脚本,该脚本从包含两个架构的输入中获取值。
输入架构如下所示:
<ns3:Root xmlns:ns3="http://schemas.microsoft.com/BizTalk/2003/aggschema">
<InputMessagePart_0>
<ADInput xmlns="http://Export">
<Employee xmlns="">
<EmployeeID>456798</EmployeeID>
<ModifyDate>11/14/2019 8:33:48 PM</ModifyDate>
<SAMA>SAMA_1</SAMA>
</Employee>
<Employee xmlns="">
<EmployeeID>123456</EmployeeID>
<ModifyDate>11/18/2019 12:21:16 PM</ModifyDate>
<SAMA>SAMA_2</SAMA>
</Employee>
<Employee xmlns="">
<EmployeeID>987654</EmployeeID>
<ModifyDate>11/5/2019 10:54:09 AM</ModifyDate>
<SAMA>SAMA_3</SAMA>
</Employee>
</ADInput>
</InputMessagePart_0>
<InputMessagePart_1>
<ns0:EmployeeUDM_Response xmlns:ns0="http://Schemas/v2/EmployeeUDM" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns0:Header Type="Employee" Source="Biztalk" Date="2019-12-04T17:15:41" />
<ns0:Return>
<ns0:Employee>
<ns0:Number>123456</ns0:Number>
<ns0:SurNameFull>SurNameFull_0</ns0:SurNameFull>
<ns0:FirstName>FirstName_0</ns0:FirstName>
<ns0:SAMA>SAMA_0</ns0:SAMA>
</ns0:Employee>
</ns0:Return>
</ns0:EmployeeUDM_Response>
</InputMessagePart_1>
</ns3:Root>
这是我在脚本functoid中的XSLT:
<xsl:template name="GetSama">
<xsl:param name="sama" />
<xsl:param name="number" />
<xsl:for-each select="//*[local-name()='ADInput']/*[local-name()='Employee']">
<xsl:if test="*[local-name()='EmployeeID'] = $number">
<xsl:element name="ns0:SAMA">
<xsl:value-of select="$sama" />
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:template>
我想有这个输出:
<ns0:EmployeeUDM_Request xmlns:ns0="http://Securitas/ESB/Schemas/v2/EmployeeUDM">
<ns0:Header Type="Employee" Source="Securitas.ESB.HR.ADToEmployeeUDM" Date="2019-12-04T14:31:18" />
<ns0:Write>
<ns0:Employee>
<ns0:Number>123456</ns0:Number>
<ns0:SurNameFull>SurNameFull_0</ns0:SurNameFull>
<ns0:FirstName>FirstName_0</ns0:FirstName>
<ns0:SAMAccountName>SAMA_2</ns0:SAMAccountName>
</ns0:Employee>
</ns0:Write>
</ns0:EmployeeUDM_Request>
我的意思是,关于InputMessagePart_1中数字节点的值,它将员工的SAMA节点与InputMessagePart_0中的相应数字节点
目前,它始终采用InputMessagePart_0中第一个员工的SAMA节点。
<ns0:EmployeeUDM_Request xmlns:ns0="http://Securitas/ESB/Schemas/v2/EmployeeUDM">
<ns0:Header Type="Employee" Source="Securitas.ESB.HR.ADToEmployeeUDM" Date="2019-12-04T14:31:18" />
<ns0:Write>
<ns0:Employee>
<ns0:Number>123456</ns0:Number>
<ns0:SurNameFull>SurNameFull_0</ns0:SurNameFull>
<ns0:FirstName>FirstName_0</ns0:FirstName>
<ns0:SAMAccountName>SAMA_1</ns0:SAMAccountName>
</ns0:Employee>
</ns0:Write>
</ns0:EmployeeUDM_Request>
我找不到我的 XSLT 中出了什么问题。
我认为如果您只是使用上下文,这会容易得多。 注意我没有测试过这个。
<xsl:template name="GetSama">
<xsl:param name="number" />
<xsl:for-each select="//ADInput">
<xsl:apply-templates select="Employee">
<xsl:with-param name="employeeid" select="$number" />
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>
<xsl:template match="Employee">
<xsl:param name="employeeid" />
<xsl:if test="EmployeeID[text()=$employeeid]">
<xsl:apply-templates select="SAMA">
</xsl:if>
</xsl:template>
<xsl:template match="SAMA">
<text><xsl:value-of select="."/></text>
</xsl:template>
终于找到一个解决方案: 只需修改我的xsl:test条件,删除sama参数(我将 xpath 放在我需要的地方(并向其中添加字符串方法。
<xsl:for-each select="//*[local-name()='ADInput']/*[local-name()='Employee']">
<xsl:if test="*[local-name()='EmployeeID' and text() = $number]">
<xsl:element name="ns0:SAMA">
<xsl:value-of select="string(*[local-name()='SAMA'])" />
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:template>