微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用XSLT比较两个XML节点

如何解决如何使用XSLT比较两个XML节点

**我需要比较两个合并的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. 场景1 [操作:添加]:如果ReportprimaryWorkEmail(在Report_Data节点中)存在InputFile节点primary_email_address,且Flag为0。||
  2. 场景2 [操作:跳过]:如果ReportprimaryWorkEmail(在Report_Data节点中)存在InputFile节点primary_email_address,且Flag为1。||
  3. 方案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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。