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

时间:2012-06-13 08:07:31

标签: 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" />

...?

我可以想象缓存可以避免产生一次又一次地读取文件的开销。

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

在这种情况下,由于我使用的是xslt1,我将不得不使用像xsle这样的库。

或者还有其他解决方案吗?

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

如果我想知道我正在使用的处理器,我会复制并过去获取一份大文档并将其作为测试时间,这不需要很长时间才能完成,这是唯一可以确定的方法你的系统。