簡體   English   中英

如何使用 XSLT 比較兩個 XML 節點

[英]How to compare two XML nodes using XSLT

**我需要比較兩個合並的 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 [操作:無效]:如果 ReportprimaryWorkEmail 中不存在 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM