在xslt中重复使用document()时的性能

在xslt中重复使用document()时的性能,xslt,Xslt,在整个xslt文件中调用相同的文档是否可以接受,如下所示: <xsl:value-of select="document('doc.xml')/root/bar/foo1" /> <xsl:value-of select="document('doc.xml')/root/bar/foo2" /> <xsl:value-of select="document('doc.xml')/root/bar/foo3" /> 我可以想象缓存避免了多次读取文件的开

在整个xslt文件中调用相同的文档是否可以接受,如下所示:

<xsl:value-of select="document('doc.xml')/root/bar/foo1" />
<xsl:value-of select="document('doc.xml')/root/bar/foo2" />
<xsl:value-of select="document('doc.xml')/root/bar/foo3" />

我可以想象缓存避免了多次读取文件的开销

或者我应该将doc.xm存储在一个变量中并使用该变量进行查询

在本例中,由于我使用的是xslt1,所以我必须使用类似xsle的库

或者还有其他解决办法吗

注意:XPath的某些部分应该是动态的,如:

<xsl:value-of select="document('doc.xml')/root/*[name()=$lang]/foo3" />

就我个人而言,当我使用它时,为了方便起见,我总是把它放在一个变量中,或者得到我需要的值,只是为了让它更易于阅读。有了我上次使用的MSXSL,我可以将它放在节点树中并以这种方式访问它

我无法想象XSL处理器不会以某种方式缓存同一个文件,但我怀疑它对于所有处理器都是不同的,而且它似乎没有被写下来


如果我想知道我使用的处理器,我只需要复制一个大文档并将其作为测试,这不需要很长时间,而且这是确保在您的系统上运行的唯一方法。

XSLT处理器需要确保,如果您使用同一URL调用document()两次,返回的节点在count(document('a.xml')|document('a'xml'))=1的意义上是相同的。如果不缓存文档,很难满足这一要求,因此我认为您可以合理地确定每个文档只会被提取和解析一次。然而,将其放入全局变量中永远不会有任何危害。

没错,通常没有其他方法可以进行测试。。。但是,同一个xslt文件可能托管在不同的平台上,因此也欢迎使用指导原则或已知的“按设计行为”。同意。使用MSXSL4时,我从未注意到两种方式的性能差异,因此我只能假设存在缓存(我使用的是大文件)。在规范中没有要求,但如果你有合理的把握,很难想象它不被实现,我现在也是:-)谢谢!为了不感到怀疑,你可以随时测量性能——在这种特定情况下,测量应该证实Michael Kay的答案。一般来说,性能测量是推荐的方法回答任何这样的问题,而不是相信任何人。迪米特里,当然,看看我对伍迪答案的评论。