xsl:value-of的最快XPath表达式

时间:2013-09-24 22:49:18

标签: xml xslt xpath value-of

我有一个XML文档,格式如下:

<Contents>
  <Content Name="ClientXML">
    <EntityData>
        <Data Name="EQ_EligibleForGuaranteedIssue">Yes</Data>
        <Data Name="ABRInd">NO</Data>
        <Data Name="AC_AgentNo">12345</Data>
        <Data Name="AC_AgentPersonallyMetWithApplicant">Has</Data>
        <Data Name="AC_City">Pomona</Data>
        <Data Name="AC_FirstName">Kimmy</Data>
        <Data Name="AC_FullName">Kimmy N Jackson</Data>
        <Data Name="AC_Initials">K J</Data>
        <Data Name="AC_LastAndSuf">Jackson</Data>
        ...
    </EntityData>
  </Content>
  <Content Name="UserXML">
    <EntityData>
        <Data Name="TransRefGUID">789-456-123456789-456</Data>
        ...
    </EntityData>
  </Content>
</Contents>

其他信息:

  1. 每个'EntityData'对象下可以有几千个'数​​据'节点
  2. 任何“名称”属性的值永远不会重复。
  3. 我必须创建一个XSL转换并使用xsl:value-of select =“...”函数。我的问题是,什么XPath表达式将执行最快?例如

    <xsl:value-of select="\\Contents\Content[@Name="ClientXML"\EntityData\Data[@Name=".."]">
    

    或只是

    <xsl:value-of select="\\Data[@Name=".."]">
    

    我无权访问最终将运行此进程的终端服务器,而本地第二个选项可能看起来更快一些。

    想知道是否有人有意见,并且如果一个人可能更快就会更大规模。

    谢谢!

2 个答案:

答案 0 :(得分:3)

在XSLT中使用键将远远快于XPath表达式,尤其是具有//的表达式,执行速度非常慢,只能在必要时使用。

<xsl:key match="Content" use="@Name" name="MyContentsLookup"/>
...
<xsl:value-of select="key('MyContentsLookup','ClientXML')"/>

XSLT处理器可以实现内部搜索机制,以快速查找数万个条目中的值,远远快于XPath。

我在这里发布了一个关于XSLT密钥的概述:http://www.CraneSoftwrights.com/resources/xslkeys/index.htm

答案 1 :(得分:0)

当你说Name的内容永远不会重复时,整个文档中是真的,还是只在每个Content元素中?如果它在全球范围内是真的,那么肯的使用键的技术是理想的。如果它只在本地使用,您可能需要考虑设置一个将Content / @ Name与EntityData / @ Name结合起来的密钥。

要记住的另一件事是性能取决于您的处理器。实现者可以以不同的方式自由地优化相同的表达式。即使在同一产品系列中,Saxon-EE也会执行表达式//Data[@Name='abc']与Saxon-HE实现它的方式完全不同(实际上,Saxon-EE会在需要时自动创建键,而不是要求您创建它们手)。因此,除了与特定实现相关之外,您不能提出性能问题。