在XSLT转换期间,我遇到了很大的性能和内存使用问题。我已经浏览了几页如何优化XSLT,其中一种方法是减少node-set()
函数的使用。
我发现msxsl
和exsl
中有两个节点集功能。这些功能在性能和内存使用方面是否不同?
答案 0 :(得分:1)
Pure XSLT 1.0没有提供将结果树片段转换为节点集的方法,因此XSLT 1.0处理器必须为该任务提供扩展功能。各种版本的Microsoft MSXML处理器在命名空间node-set
中提供了一个本地名称为urn:schemas-microsoft-com:xslt
的文档,并且文档和许多示例将该命名空间与前缀msxsl
联系起来以便使用示例然后调用msxsl:node-set($rtf-var)
。您可以使用任何其他前缀,但重要的是命名空间,MSXML仅适用于命名空间urn:schemas-microsoft-com:xslt
。
据我所知,在.NET框架中,XslTransform
类(现已过时)也仅支持该Microsoft命名空间node-set
中的扩展函数`urn:schemas-microsoft-com:xslt
。
然而,由于EXSLT iniative在名称空间node-set
中标准化了一个名为http://exslt.org/common
的扩展函数,许多XSLT处理器现在都支持该EXSLT扩展函数,该函数通常称为exsl:node-set
但是重要的是命名空间而不是前缀。 .NET框架中的Microsoft XslCompiledTransform
支持node-set
函数的扩展函数名称空间,因此您可以选择。功能没有区别,我不知道任何性能差异,我不认为有一个,因为我无法想象为什么一个不同的名称应该导致一个不同的,更复杂的实现。< / p>
我宁愿考虑样式表需要哪种兼容性,如果你想用.NET和MSXML(例如在Internet Explorer中)运行它,那么如果你想运行,请选择命名空间urn:schemas-microsoft-com:xslt
它与.NET以及其他平台上的XSLT处理器一起使用,因此EXSLT命名空间可以提供更好的兼容性。
甚至MSXML也可以说服#34;通过使用在JScript或VBScript中完成的简单扩展函数脚本来支持EXSLT命名空间中的node-set
函数,但这种方法可能会导致性能下降,因为XSLT处理器必须加载脚本引擎。
答案 1 :(得分:1)
您没有提供有关为什么您认为node-set()函数与性能问题有关的信息。实际上,您没有向我们提供有关转换性质,您所进行的性能测量或您正在使用的技术的信息。你告诉我们的只是你搜索了性能问题的可能原因并且你正在探索其中一个。
你需要更加系统化。首先测量性能(时间和内存)如何随着数据量的增加而变化;图表会告诉我们很多。使用Saxon的-TP等分析工具来查看时间的变化。简单地测试不同处理器的性能如何变化可能是有益的。基本上,在你开始提出理论之前,你需要数据。
答案 2 :(得分:0)
我想知道你为什么要使用node-set ... Taken from this 12 year old post
&#34;如果您还没有猜到,XSLT 2.0已经向您展示了RTF。现在,当您使用xsl:variable创建临时树时,该变量的值是一个真正的节点集。实际上,在XPath 2.0术语中,它是一个真正的节点序列,由一个文档节点组成,它是XPath 2.0的名称,用于XPath 1.0称为&#34;根节点&#34;。使用该序列,您可以使用路径表达式在树内向下钻取,将模板应用于它,等等,就像使用任何其他源文档一样。使用XSLT 2.0,不再需要node-set()扩展功能。&#34;