我可以在变量下的节点的属性上使用密钥吗?

时间:2014-03-31 18:02:32

标签: xml xslt indexing

我在XSLT中的变量中有一大块XML。这是概述:

....
<xsl:variable name="node_clone">
  <xsl:call-template name="node_content"/>
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($node_clone)/*">

<xsl:template name="node_content">
  <xsl:copy-of select"exsl:node-set($dummy_container)//sometag[someatr='..']">
<xsl:template>

...

<xsl:variable name="dummy_container">
  <big_chunk_of_xml>
    ...
    <!--THIS IS WHAT I WANT TO ACCESS FAST -->
    <sometag someatr="value">....

  </big_chunk_of_xml>
</xsl>

此代码从变量(dummy_container)中的一大块xml中获取一个元素,克隆它并在其上调用模板。

这将多次发生,并且dummy_container中的大块xml将被多次访问。我可以在sometag的someatr上使用key()来加快速度吗?

呼叫的工作方式可能没有意义,它已被简化为专注于真正的问题:索引。所以请不要被困在这里做的事情上。我正在使用XSLT 1.0

1 个答案:

答案 0 :(得分:0)

您可以定义一个键并进行搜索:

<xsl:key name="k1" match="sometag[@someatr]" use="@someatr"/>


<xsl:variable name="lkp-doc" select="exsl:node-set($dummy-container)"/>

<xsl:template name="node-content">
  <xsl:param name="value"/>
  <!-- need to change context document here to make sure the key function
       works with the right document -->
  <xsl:for-each select="$lkp-doc">
    <xsl:copy-of select="key('k1', $value)"/>
  </xsl:for-each>
</xsl:template>