我的 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_1number 节点的值,它需要 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>