我的 XSLT 提取与节点值相对应的值有什么问题?
What wrong with my XSLT to extract a value that correspond to a node value?
我处理 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 中 number 节点的值,它需要 InputMessagePart_0
中对应号节点的员工的SAMA节点
目前,它始终采用 InputMessagePart_0.[=14= 中第一个员工的 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>
我处理 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 中 number 节点的值,它需要 InputMessagePart_0
中对应号节点的员工的SAMA节点目前,它始终采用 InputMessagePart_0.[=14= 中第一个员工的 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>