问题描述
**我需要比较两个合并的XML,但是下面的代码不起作用。 **
XML:
<File>
<wd:Report_Data xmlns:wd="urn:com.workday.report/CR">
<wd:Report_Entry>
<wd:Worker>Bal Shil (1234)</wd:Worker>
<wd:Employee_ID>1234</wd:Employee_ID>
<wd:User_Name>bal</wd:User_Name>
<wd:ReportprimaryWorkEmail>bal.shil@gmail.com</wd:ReportprimaryWorkEmail>
<wd:Security_Groups>
<wd:Security_Group_Name>SG Group 1</wd:Security_Group_Name>
<wd:Security_Group_Type>UBSG Group</wd:Security_Group_Type>
<wd:Reference_ID_Type_XML_Name>Group_ID</wd:Reference_ID_Type_XML_Name>
<wd:SG_Reference_ID>SG_Learning</wd:SG_Reference_ID>
</wd:Security_Groups>
<wd:Flag>0</wd:Flag>
<wd:Company>AB</wd:Company>
</wd:Report_Entry>
<wd:Report_Entry>
</wd:Report_Data>
<wd:Report_Entry>
<wd:Worker>Har Sneh(2345)</wd:Worker>
<wd:Employee_ID>2345</wd:Employee_ID>
<wd:User_Name>har</wd:User_Name>
<wd:ReportprimaryWorkEmail>har.sneh@gmail.com</wd:ReportprimaryWorkEmail>
<wd:Security_Groups>
<wd:Security_Group_Name>SG Group 1</wd:Security_Group_Name>
<wd:Security_Group_Type>UBSG Group</wd:Security_Group_Type>
<wd:Reference_ID_Type_XML_Name>Group_ID</wd:Reference_ID_Type_XML_Name>
<wd:SG_Reference_ID>SG_Learning</wd:SG_Reference_ID>
</wd:Security_Groups>
<wd:Flag>1</wd:Flag>
<wd:Company>IT AB</wd:Company>
</wd:Report_Entry>
</wd:Report_Data>
<InputFile>
<Record>
<primary_email_address>sun.tan@hotmail.com</primary_email_address>
<preferred_last_name/>
<preferred_first_name/>
</Record>
<Record>
<primary_email_address>bal.shil@gmail.com</primary_email_address>
<preferred_last_name/>
<preferred_first_name/>
</Record>
<Record>
<primary_email_address>Ami.anu@note.com</primary_email_address>
<preferred_last_name/>
<preferred_first_name/>
</Record>
<Record>
<primary_email_address>har.sneh@gmail.com</primary_email_address>
<preferred_last_name/>
<preferred_first_name/>
</Record>
</InputFile>
</File>
我正在尝试将InputFile primary_email_address与Report_Data ReportprimaryWorkEmail进行比较,但是在XSLT以下代码始终与ReportprimaryWorkEmail的第一个Report_Data条目进行比较
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wd="urn:com.workday.report/CR">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<LogFile>
<xsl:for-each select="File/wd:Report_Data/wd:Report_Entry">
<xsl:choose>
<xsl:when test="(wd:ReportprimaryWorkEmail = //primary_email_address ) and (wd:Flag = '0')">
<EmpRecord>
<EmpID>
<xsl:value-of select="wd:Employee_ID"/>
</EmpID>
<Operation>
<xsl:text>Add</xsl:text>
</Operation>
<Email>
<xsl:value-of select="wd:ReportprimaryWorkEmail"/>
</Email>
</EmpRecord>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<xsl:for-each select="File/InputFile/Record/primary_email_address">
<xsl:choose>
<xsl:when test="not(//File/wd:Report_Data/wd:Report_Entry[wd:ReportprimaryWorkEmail]/wd:ReportprimaryWorkEmail=.)">
<EmpRecord>
<Email>
<xsl:value-of select="."/>
</Email>
<Operation>
<xsl:text>Invalid</xsl:text>
</Operation>
<LastName>
<xsl:value-of select="../preferred_last_name"/>
</LastName>
<FirstName>
<xsl:value-of select="../preferred_first_name"/>
</FirstName>
</EmpRecord>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</LogFile>
</xsl:template>
</xsl:stylesheet>
请帮助我与Report_Data的所有节点进行比较
*我需要将Report_Data节点与InputFile节点进行比较,并在以下情况下获取输出:------
- 场景1 [操作:添加]:如果ReportprimaryWorkEmail(在Report_Data节点中)存在InputFile节点primary_email_address,且Flag为0。||
- 场景2 [操作:跳过]:如果ReportprimaryWorkEmail(在Report_Data节点中)存在InputFile节点primary_email_address,且Flag为1。||
- 方案3 [操作:无效]:如果InputprimaryWorkEmail中不存在InputFile节点primary_email_address(在Report_Data节点中)*
所需的输出
<Logfile>
<EmpRecord>
<Email>sun.tan@hotmail.com</Email>
<Operation>Invalid </Operation>
<preferred_last_name/>
<preferred_first_name/>
</EmpRecord>
<EmpRecord>
<Email>bal.shil@gmail.com</Email>
<Operation>Add</Operation>
<EmpID>1234</EmpID>
</EmpRecord>
<EmpRecord>
<Email>sun.tan@hotmail.com</Email>
<Operation>Invalid </Operation>
<preferred_last_name/>
<preferred_first_name/>
</EmpRecord>
<EmpRecord>
<Email>har.sneh@gmail.com</Email>
<Operation>Skip</Operation>
<EmpID>2345</EmpID>
</EmpRecord>
</Logfile>
解决方法
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wd="urn:com.workday.report/CR">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="vInputFile" select="File/InputFile"/>
<xsl:variable name="vReportFile" select="File/wd:Report_Data"/>
<xsl:template match="/">
<LogFile>
<xsl:for-each select="File/wd:Report_Data/wd:Report_Entry">
<xsl:variable name="vReportnode" select="$vInputFile/Record[primary_email_address=current()/wd:ReportprimaryWorkEmail]/."/>
<xsl:choose>
<xsl:when test="$vReportnode !=''">
<xsl:if test="current()/wd:LinkedIn_Flag='0'">
<EmpRecord>
<EmpID>
<xsl:value-of select="current()/wd:Employee_ID"/>
</EmpID>
<Operation>
<xsl:text>Add</xsl:text>
</Operation>
<Email>
<xsl:value-of select="current()/wd:ReportprimaryWorkEmail"/>
</Email>
</EmpRecord>
</xsl:if>
<xsl:if test="current()/wd:LinkedIn_Flag='1'">
<EmpRecord>
<EmpID>
<xsl:value-of select="current()/wd:Employee_ID"/>
</EmpID>
<Operation>
<xsl:text>Skip</xsl:text>
</Operation>
<Email>
<xsl:value-of select="current()/wd:ReportprimaryWorkEmail"/>
</Email>
</EmpRecord>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:if test="current()/wd:LinkedIn_Flag='1'">
<EmpRecord>
<EmpID>
<xsl:value-of select="current()/wd:Employee_ID"/>
</EmpID>
<Operation>
<xsl:text>Remove</xsl:text>
</Operation>
<Email>
<xsl:value-of select="current()/wd:ReportprimaryWorkEmail"/>
</Email>
</EmpRecord>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<xsl:for-each select="File/InputFile/Record">
<xsl:variable name="vInputFilenode" select="$vReportFile/wd:Report_Entry[wd:ReportprimaryWorkEmail=current()/primary_email_address]/."/>
<xsl:choose>
<xsl:when test="$vInputFilenode !=''">
</xsl:when>
<xsl:otherwise>
<EmpRecord>
<Email>
<xsl:value-of select="current()/primary_email_address"/>
</Email>
<Operation>
<xsl:text>Invalid</xsl:text>
</Operation>
<Last_name>
<xsl:value-of select="current()/preferred_last_name"/>
</Last_name>
<First_name>
<xsl:value-of select="current()/preferred_first_name"/>
</First_name>
</EmpRecord>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</LogFile>
</xsl:template>
</xsl:stylesheet>