XSLT,在 For 循环中搜索大型文档

XSLT , search large document inside For Loop

我有一个超过 20k 的大 xml 文件 records.Here 是 xml 文件的示例。 我需要遍历每个员工记录(在本例中为 )并读取其内容。

每个员工记录都有其经理“Employee_ID”。使用经理的“Employee_ID”,我需要找到经理的电子邮件地址。

我可以使用下面的代码来完成,但它需要很多时间。有人可以建议是否有任何其他方法可以实现这一目标吗?

这是我的 xslt 模板:

 <xsl:template match="/">
    <tns:Root>
      <xsl:for-each select="/ns0:Report_Data/ns0:Report_Entry">
        <tns:Record>
          <tns:FirstName>
            <xsl:value-of select="ns0:Legal_First_Name"/>
          </tns:FirstName>
          <xsl:variable name="Manager_Emp_Id" select="ns0:Manager_Level_01/ns0:ID[@ns0:type='Employee_ID']"/>
          <tns:ManagerEmail>
            <xsl:value-of select="/ns0:Report_Data/ns0:Report_Entry[ns0:Employee_ID=$Manager_Emp_Id]/ns0:Emails_group/ns0:Email_Address"/>
          </tns:ManagerEmail>
        </tns:Record>
      </xsl:for-each>
    </tns:Root>
  </xsl:template>

这是我的 xslt 模板: 这是示例 xml 文件:

<?xml version="1.0" encoding="UTF-8" ?>
<Report_Data xmlns:wd="deltacore.com" xmlns="deltacore.com">
  <wd:Report_Entry>
    <wd:User_Name>EM11</wd:User_Name>
    <wd:Employee_ID>1111</wd:Employee_ID>
    <wd:Legal_First_Name>John</wd:Legal_First_Name>
    <wd:Legal_Last_Name>William</wd:Legal_Last_Name>
    <wd:Legal_Name_in_General_Display_Format>John William</wd:Legal_Name_in_General_Display_Format>
    <wd:Legal_Name_in_Reporting_Display_Format>William, John</wd:Legal_Name_in_Reporting_Display_Format>
    <wd:Full_Legal_Name>John William</wd:Full_Legal_Name>
    <wd:Preferred_First_Name>John</wd:Preferred_First_Name>
    <wd:Preferred_Last_Name>William</wd:Preferred_Last_Name>
    <wd:Preferred_Name_group/>
    <wd:Preferred_Name_in_General_Display_Format>John William</wd:Preferred_Name_in_General_Display_Format>
    <wd:Preferred_Name_in_Reporting_Display_Format>William, John</wd:Preferred_Name_in_Reporting_Display_Format>
    <wd:Emails_group>
      <wd:Email_Usage_Type wd:Descriptor="Work">
        <wd:ID wd:type="Communication_Usage_Type_ID">WORK</wd:ID>
      </wd:Email_Usage_Type>
      <wd:Email_Visibility wd:Descriptor="Public">
        <wd:ID wd:type="Communication_Usage_Access_ID">PUBLIC</wd:ID>
      </wd:Email_Visibility>
      <wd:Is_Primary>1</wd:Is_Primary>
      <wd:Email_Address>John.William@deltacore.com</wd:Email_Address>
    </wd:Emails_group>
 
    <wd:Manager_Level_01 wd:Descriptor="Peter Samual">
      <wd:ID wd:type="Employee_ID">2222</wd:ID>
    </wd:Manager_Level_01>
    <wd:Manager_-_Level_01_group>
      <wd:Manager_Employee_ID>2222</wd:Manager_Employee_ID>
      <wd:Manager_Full_Legal_Name>Peter Samual</wd:Manager_Full_Legal_Name>
    </wd:Manager_-_Level_01_group>
  </wd:Report_Entry>
  
  
  <wd:Report_Entry>
    <wd:User_Name>TM222</wd:User_Name>
    <wd:Employee_ID>2222</wd:Employee_ID>
    <wd:Legal_First_Name>Peter</wd:Legal_First_Name>
    <wd:Legal_Last_Name>Samual</wd:Legal_Last_Name>
    <wd:Legal_Name_in_General_Display_Format>Peter Samual</wd:Legal_Name_in_General_Display_Format>
    <wd:Legal_Name_in_Reporting_Display_Format>Samual, Peter</wd:Legal_Name_in_Reporting_Display_Format>
    <wd:Full_Legal_Name>Peter Samual</wd:Full_Legal_Name>
    <wd:Preferred_First_Name>Peter</wd:Preferred_First_Name>
    <wd:Preferred_Last_Name>Samual</wd:Preferred_Last_Name>
    <wd:Preferred_Name_group/>
    <wd:Preferred_Name_in_General_Display_Format>Peter Samual</wd:Preferred_Name_in_General_Display_Format>
    <wd:Preferred_Name_in_Reporting_Display_Format>Samual, Peter</wd:Preferred_Name_in_Reporting_Display_Format>
    <wd:Gender wd:Descriptor="Male">
      <wd:ID wd:type="Gender_Code">Male</wd:ID>
    </wd:Gender>
    <wd:Emails_group>
      <wd:Email_Usage_Type wd:Descriptor="Work">
        <wd:ID wd:type="Communication_Usage_Type_ID">WORK</wd:ID>
      </wd:Email_Usage_Type>
      <wd:Email_Visibility wd:Descriptor="Public">
        <wd:ID wd:type="Communication_Usage_Access_ID">PUBLIC</wd:ID>
      </wd:Email_Visibility>
      <wd:Is_Primary>1</wd:Is_Primary>
      <wd:Email_Address>John.Samual@deltacore.com</wd:Email_Address>
    </wd:Emails_group>
    <wd:Manager_Level_01 wd:Descriptor="Test Manager">
      <wd:ID wd:type="Employee_ID">3333</wd:ID>
    </wd:Manager_Level_01>
    <wd:Manager_-_Level_01_group>
      <wd:Manager_Employee_ID>3333</wd:Manager_Employee_ID>
      <wd:Manager_Full_Legal_Name>Test Manager</wd:Manager_Full_Legal_Name>
    </wd:Manager_-_Level_01_group>
  </wd:Report_Entry>
</Report_Data>

声明一个密钥

       <xsl:key name="id" match="wd:Report_Entry" use="ns0:Employee_ID"/>

作为 top-level 元素(即 xsl:stylesheetxsl:transform 的子元素),然后使用例如

      <tns:ManagerEmail>
        <xsl:value-of select="key('id', $Manager_Emp_Id)/ns0:Emails_group/ns0:Email_Address"/>
      </tns:ManagerEmail>

为 cross-reference。