我需要一个信息来优化我的 xslt。
在我的模板中,我多次访问一个 child ,例如:
<xsl:template match="user">
<h1><xsl:value-of select="address/country"/></h1>
<p><xsl:value-of select="address/country"/></p>
<p><xsl:value-of select="address/country"/></p>
... more and more...
<p><xsl:value-of select="address/country"/></p>
</xsl:template>
是不是把子元素的内容存到一个变量里,直接调用这个变量,避免每次都去解析树:
<xsl:template match="user">
<xsl:variable name="country" select="address/country"/>
<h1><xsl:value-of select="$country"/></h1>
<p><xsl:value-of select="$country"/></p>
<p><xsl:value-of select="$country"/></p>
... more and more...
<p><xsl:value-of select="$country"/></p>
</xsl:template>
或者使用一个变量会不会比多次解析树消耗更多的资源?
最佳答案
通常,一个 XML 文件被作为一个整体进行解析,并作为 XDM 保存在内存中。 .所以,我想通过
than parsing the tree multiple times
您实际上是指多次访问 XML 输入的内部表示。下图说明了这一点,我们正在谈论源代码树:
![]()
(taken from Michael Kay's XSLT 2.0 and XPath 2.0 Programmer's Reference, page 43)
同样,xsl:variable 创建一个保存在内存中并且也需要访问的节点(或者更准确地说,一个临时文档)。
现在,您所说的优化到底是什么意思?您是指执行转换所需的时间还是 CPU 和内存使用量(正如您在问题中提到的“资源”)?
此外,性能当然取决于 XSLT 处理器的实现。找出答案的唯一可靠方法是实际测试。
编写两个仅在这方面不同的样式表,即其他方面相同。然后,让它们转换相同的输入 XML 并测量它们花费的时间。
我的猜测是访问变量更快,而且在编写代码时重复变量名比重复完整路径更方便(这有时称为“便利变量”)。
编辑:替换为更合适的内容,作为对您评论的回应。
如果你真的测试这个,写两个样式表:
带有变量的样式表
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/root">
<xsl:copy>
<xsl:variable name="var" select="node/subnode"/>
<subnode nr="1">
<xsl:value-of select="$var"/>
</subnode>
<subnode nr="2">
<xsl:value-of select="$var"/>
</subnode>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
没有变量的样式表
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/root">
<xsl:copy>
<subnode nr="1">
<xsl:value-of select="node/subnode"/>
</subnode>
<subnode nr="2">
<xsl:value-of select="node/subnode"/>
</subnode>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
应用于以下输入 XML:
<root>
<node>
<subnode>helloworld</subnode>
</node>
</root>
编辑:正如@Michael Kay 所建议的,我测量了 100 次运行的平均时间(“Saxon 命令行上的 -t 和 -repeat:100”):
with variable: 9 ms
without variable: 9 ms
这并不意味着结果与您的 XSLT 处理器相同。
关于xml - xslt 优化 : access child multiple time or use variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21904681/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::
我正在遍历数组中的一组标签名称,我想使用构建器打印每个标签名称,而不是求助于“我认为:builder=Nokogiri::XML::Builder.newdo|xml|fortagintagsxml.tag!tag,somevalendend会这样做,但它只是创建名称为“tag”的标签,并将标签变量作为元素的文本值。有人可以帮忙吗?这个看起来应该比较简单,我刚刚在搜索引擎上找不到答案。我可能没有以正确的方式提问。 最佳答案 尝试以下操作。如果我没记错的话,我添加了一个根节点,因为Nokogiri需要一个。builder=Nokogi
这是一些奇怪的例子:#!/usr/bin/rubyrequire'rubygems'require'open-uri'require'nokogiri'print"withoutread:",Nokogiri(open('http://weblog.rubyonrails.org/')).class,"\n"print"withread:",Nokogiri(open('http://weblog.rubyonrails.org/').read).class,"\n"运行此返回:withoutread:Nokogiri::XML::Documentwithread:Nokogiri::
我正在尝试加载SAML协议(protocol)架构(具体来说:https://www.oasis-open.org/committees/download.php/3407/oasis-sstc-saml-schema-protocol-1.1.xsd),但在执行此操作之后:schema=Nokogiri::XML::Schema(File.read('saml11_schema.xsd'))我得到这个输出:Nokogiri::XML::SyntaxErrorException:Element'{http://www.w3.org/2001/XMLSchema}element',att
我希望Ruby的解析器会进行这种微不足道的优化,但似乎并没有(谈到YARV实现,Ruby1.9.x、2.0.0):require'benchmark'deffib1a,b=0,1whileb由于这两种方法除了在第二种方法中使用预定义常量而不是常量表达式外是相同的,因此Ruby解释器似乎在每个循环中一次又一次地计算幂常数。是否有一些Material说明为什么Ruby根本不进行这种基本优化或只在某些特定情况下进行? 最佳答案 很抱歉给出了另一个答案,但我不想删除或编辑我之前的答案,因为它下面有有趣的讨论。正如JörgWMittag所说,
我正在尝试从数据库中读取大量单元格(超过100.000个)并将它们写入VPSUbuntu服务器上的csv文件。碰巧服务器没有足够的内存。我正在考虑一次读取5000行并将它们写入文件,然后再读取5000行,等等。我应该如何重构我当前的代码以使内存不会被完全消耗?这是我的代码:defwrite_rows(emails)File.open(file_path,"w+")do|f|f该函数由sidekiqworker调用:write_rows(user.emails)感谢您的帮助! 最佳答案 这里的问题是,当您调用emails.each时,
文章目录前言约束硬约束的轨迹优化Corridor-BasedTrajectoryOptimizationBezierCurveOptimizationOtherOptions软约束的轨迹优化Distance-BasedTrajectoryOptimization优化方法前言可以看看我的这几篇Blog1,Blog2,Blog3。上次基于MinimumSnap的轨迹生成,有许多优点,比如:轨迹让机器人可以在某个时间点抵达某个航点。任何一个时刻,都能数学上求出期望的机器人的位置、速度、加速度、导数。MinimumSnap可以把问题转换为凸优化问题。缺点:MnimumSnap可以控制轨迹一定经过中间的
我对为我的RubyonRails3.1.3应用优化我的Unicorn设置的方法很感兴趣。我目前正在高CPU超大实例上生成14个工作进程,因为我的应用程序在负载测试期间似乎受CPU限制。在模拟负载测试中,每秒大约20个请求重放请求,我的实例上的所有8个内核都达到峰值,盒子负载飙升至7-8个。每个unicorn实例使用大约56-60%的CPU。我很好奇可以通过哪些方式对其进行优化?我希望能够每秒将更多请求汇集到这种大小的实例上。内存和所有其他I/O一样完全正常。在我的测试过程中,CPU越来越低。 最佳答案 如果您受CPU限制,您希望使用
美团外卖搜索工程团队在Elasticsearch的优化实践中,基于Location-BasedService(LBS)业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-LengthEncoding(RLE)设计了一款高效的倒排索引结构,使检索耗时(TP99)降低了84%。本文从问题分析、技术选型、优化方案等方面进行阐述,并给出最终灰度验证的结论。1.前言最近十年,Elasticsearch已经成为了最受欢迎的开源检索引擎,其作为离线数仓、近线检索、B端检索的经典基建,已沉淀了大量的实践案例及优化总结。然而在高并发、高可用、大数据量的C端场景,目前可参考的资料并不多。因此