比较xslt中2 xmls的数据

时间:2016-11-16 13:51:39

标签: xslt xslt-1.0

我是XSL的新手。因此,请帮助我以下。 我有2个xmls。我必须在XSL转换中执行以下操作。

如果Employee / EmployeeInfo / FirstName = EmployeeSegment / EmployeeSummary / GivenName和Employee / EmployeeInfo / LastName = EmployeeSegment / EmployeeSummary / Surname   employeeId = EmployeeSegment / EmployeeSummary / EmpId

XML1

<Employee>
  <EmployeeInfo>
    <FirstName>ABC</FirstName>
    <LastName>DEF</LastName>
  </EmployeeInfo>
</Employee>

XML2

<EmployeeSegment>
  <EmployeeSummary>
    <EmpId>1234</EmpId>
    <GivenName>ABC</GivenName>
    <Surname>DEF</Surname>
  </EmployeeSummary>
</EmployeeSegment> 

我尝试了以下内容。它不起作用。

<xsl:param name="cjEmployeeSegment" select="document('CJ_Response.xml')"/>
<xsl:for-each select="/ns3:Employee/ns3:EmployeeInfo">
  <xsl:variable name="empFirstName">
      <xsl:value-of select="ns1:FirstName"/>
  </xsl:variable>
  <xsl:variable name="empLastName">
      <xsl:value-of select="ns1:LastName"/>
  </xsl:variable>
  <xsl:for-each select="$cjEmployeeSegment/v32:EmployeeSegment/v31:EmployeeSummary">
    <xsl:if test="$empFirstName=v31:GivenName and $empLastName=v31:Surname">
      <ns12:EmployeeIdentifier>
        <ns12:EmployeeID>
          <xsl:value-of select="v31:EmpId"/>
        </ns12:EmployeeID>
      </ns12:EmployeeIdentifier>
    </xsl:if>
  </xsl:for-each>
</xsl:for-each> 

1 个答案:

答案 0 :(得分:1)

假设您正在处理以下输入:

<强> XML

<Employee>
  <EmployeeInfo>
    <FirstName>ABC</FirstName>
    <LastName>DEF</LastName>
  </EmployeeInfo>
</Employee>

还有另一个名为CJ_Response.xml的XML文档:

<EmployeeSegment>
  <EmployeeSummary>
    <EmpId>1234</EmpId>
    <GivenName>ABC</GivenName>
    <Surname>DEF</Surname>
  </EmployeeSummary>
</EmployeeSegment> 

您可以使用以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:param name="cj_Response" select="document('CJ_Response.xml')"/>

<xsl:template match="/Employee">
    <root>
        <xsl:for-each select="EmployeeInfo">
            <xsl:variable name="lookup" select="$cj_Response/EmployeeSegment/EmployeeSummary[GivenName = current()/FirstName and Surname = current()/LastName]" />
            <xsl:if test="$lookup">
                <EmployeeIdentifier>
                    <EmployeeID>
                        <xsl:value-of select="$lookup/EmpId"/>
                    </EmployeeID>
                </EmployeeIdentifier>
            </xsl:if>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

返回:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <EmployeeIdentifier>
      <EmployeeID>1234</EmployeeID>
   </EmployeeIdentifier>
</root>

当然,如果有两个或更多同名的员工,这将失败。