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:stylesheet
或 xsl:transform
的子元素),然后使用例如
<tns:ManagerEmail>
<xsl:value-of select="key('id', $Manager_Emp_Id)/ns0:Emails_group/ns0:Email_Address"/>
</tns:ManagerEmail>
为 cross-reference。
我有一个超过 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:stylesheet
或 xsl:transform
的子元素),然后使用例如
<tns:ManagerEmail>
<xsl:value-of select="key('id', $Manager_Emp_Id)/ns0:Emails_group/ns0:Email_Address"/>
</tns:ManagerEmail>
为 cross-reference。