XSLT:由于复杂的XPath表达式导致性能不佳?

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)

说明:

  • 标签是附加到电影的属性(事实上,它是一个类别).
  • 一组是电影的枚举.
  • 一个节目参考电影或一组.
  • 我想要的是:对于每个标签,我正在寻找引用具有当前标签的电影的节目以及引用至少一个电影具有当前标签的组的节目.

Stu*_*tLC 6

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)