Nic*_*uin 0 xslt performance xpath
在XSLT程序中的某个时刻,我有以下内容:
<xsl:for-each select="tags/tag">
<xsl:apply-templates select="//shows/show[film=//films/film[tag=current()/@id]/@id]|//shows/show[group=//groups/group[film=//films/film[tag=current()/@id]/@id]/@id]">
<xsl:sort select="date" data-type="text" order="ascending"/>
<xsl:sort select="time" data-type="text" order="ascending"/>
</xsl:apply-templates>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
似乎XPath表达式//shows/show[film=//films/film[tag=current()/@id]/@id]|//shows/show[group=//groups/group[film=//films/film[tag=current()/@id]/@id]/@id]
相当复杂,大大减慢了程序的执行速度(与添加引用代码之前的执行时间相比 - 当然是处理相同的数据).
你认为这是正常的,因为表达的性质相对复杂,你是否看到我如何改进它以使其表现更好?
注意:在XPath表达式中,film
和//films/film
,group
并//groups/group
引用不同的元素.
请参阅下面的XML输入的精简样本.
<program>
<tags>
<tag id="1">Tag1</tag>
<tag id="2">Tag2</tag>
<tag id="3">Tag3</tag>
</tags>
<films>
<film id="1">
Film1
<tag>2</tag><!-- References: /program/tags/tag/@id=2 -->
</film>
<film id="2">
Film2
<tag>1</tag><!-- References: /program/tags/tag/@id=1 -->
</film>
<film id="3">
Film3
<tag>3</tag><!-- References: /program/tags/tag/@id=3 -->
</film>
<film id="4">
Film4
<tag>3</tag><!-- References: /program/tags/tag/@id=3 -->
</film>
</film>
<groups>
<group id="1">
<film>3</film><!-- References: /program/films/film/@id=3 -->
<film>4</film><!-- References: /program/films/film/@id=4 -->
</group>
</groups>
<shows>
<show id="1"><!-- Show with film (=simple) -->
<film>1</film><!-- References: /program/films/film/@id=1 -->
<date>2011-12-12</date>
<time>12:00</time>
</show>
<show id="2"><!-- Show with group (=combined) -->
<group>1</group><!-- References: /program/groups/group/@id=1 -->
<date>2011-12-12</date>
<time>14:00</time>
</show>
</shows>
</program>
Run Code Online (Sandbox Code Playgroud)
说明:
XPath中的双斜线是处理大型文档时的性能和CPU占用(因为必须评估文档中的每个节点).如果您可以用绝对或相对路径替换它,您应该有明显的改进.如果您可以发布输入架构和所需的输出,我们可能更具体?
例如,使用绝对路径
//shows/show[film=//films/film[tag=current()/@id]/@id]
Run Code Online (Sandbox Code Playgroud)
变
/myroot/somepath/shows/show[film=/myroot/somepath/films/film[tag=current()/@id]/@id]
Run Code Online (Sandbox Code Playgroud)
或者如果节目和电影是相对于当前节点的
./relativexpath/shows/show[film=./relativexpath/somepath/films/film[tag=current()/@id]/@id]
Run Code Online (Sandbox Code Playgroud)