【发布时间】:2011-12-11 15:08:55
【问题描述】:
在 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>
看起来相当复杂的 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>
解释:
- 标签是附加到电影的属性(实际上,它是一个类别)。
- 组是电影的枚举。
- 节目参考电影或团体。
- 我想要什么:对于每个标签,我都在寻找引用具有当前标签的电影的节目和引用至少其中一部电影具有当前标签的组的节目。
【问题讨论】:
标签: performance xslt xpath