我有一个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>
其他信息:
我必须创建一个XSL转换并使用xsl:value-of select =“...”函数。我的问题是,什么XPath表达式将执行最快?例如
<xsl:value-of select="\\Contents\Content[@Name="ClientXML"\EntityData\Data[@Name=".."]">
或只是
<xsl:value-of select="\\Data[@Name=".."]">
我无权访问最终将运行此进程的终端服务器,而本地第二个选项可能看起来更快一些。
想知道是否有人有意见,并且如果一个人可能更快就会更大规模。
谢谢!
答案 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会在需要时自动创建键,而不是要求您创建它们手)。因此,除了与特定实现相关之外,您不能提出性能问题。