【问题标题】:XSLT , search large document inside For LoopXSLT,在 For 循环中搜索大文档
【发布时间】:2020-08-31 14:30:25
【问题描述】:

我有一个包含超过 20k 条记录的大型 xml 文件。这里是 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>

【问题讨论】:

    标签: xslt xslt-1.0 xslt-2.0


    【解决方案1】:

    声明一个密钥

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

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

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

    用于交叉引用。

    【讨论】:

    • @ MaritinHonnen 忘记强调为什么优秀的 XSLT 处理器可以使用哈希表实现xsl:key 以实现高效的文档索引。他甚至忘记在他自己维护的网站上展示他的解决方案的实现。考虑一下我的翻译:xsltfiddle.liberty-development.net/6pS2B6Y.
    猜你喜欢
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2023-03-19
    • 2018-12-06
    相关资源
    最近更新 更多