我正在创建一个xsl stylehseet并想出了这个(在我看来是不合逻辑的行为):
这个XPath:
/ root / element [1] [@ attr1!='1'或@ attr2!='test']
比这个XPath慢得多:
/ root / element [count(preceding-sibling :: element)+ 1 = 1)and(@ attr1!='1'或@ attr2!='test')]
我有50个样本xml,第一个XPath需要大约55秒 使用第二个XPath需要大约4秒!
我使用XslCompiledTransform(C#.NET 4.5)。
有人可以解释为什么第一个XPath比第二个慢得多吗?我一直认为最好使用显式索引过滤器。
更新: 一些示例xml:
<?xml version="1.0" encoding="iso-8859-1"?>
<root>
<element attr2="test" attr1="1">
<child>17</child>
<child>17</child>
<child>16</child>
...
<child>3</child>
<child>2</child>
<child>1</child>
</element>
<element attr2="test2" attr1="2">
<child/>
<child/>
<child/>
<child/>
<child/>
<child/>
<child/>
...
<child/>
</element>
....
<element attr2="test21" attr1="21" />
只有20-25个元素有n个子元素但深度最大值为4(/ root / element / child / anotherChild)。
答案 0 :(得分:0)
我找到了解决方案,我必须接受这一点。 微软称https://support.microsoft.com/en-us/kb/815124:
使用显式索引过滤器,所有版本的MSXML 3.0及更高版本都更快。性能的提高取决于父元素列表中元素的位置。而不是使用以下内容:
/ CHILD_ELEMENT
使用以下内容:
/ CHILD_ELEMENT [1]
就我而言,第一个例子比微软的推荐更快。