2

我有以下格式的 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”对象下可以有数千个“Data”节点
  2. 任何“名称”属性的值都不会重复。

我必须创建一个 XSL 转换并使用 xsl:value-of select="..." 函数​​。我的问题是,哪个 XPath 表达式执行得最快?例如

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

或者干脆

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

我无权访问最终将运行此过程的最终服务器,并且在本地,第二个选项可能看起来要快一些。

想知道是否有人有意见,并且在更大的范围内是否可以更快。

谢谢!

4

2 回答 2

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

于 2013-09-25T00:08:24.657 回答
0

当您说 Name 的内容从不重复时,在整个文档中是这样,还是仅在每个 Content 元素中如此?如果它在全球范围内都是正确的,那么 Ken 使用键的技术是理想的。如果仅在本地为真,您可能需要考虑设置一个组合 Content/@Name 与 EntityData/@Name 的键。

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

于 2013-09-25T07:49:06.747 回答