是否可以在xsl:key指令中使用变量?

时间:2013-01-18 17:33:01

标签: asp.net xml xslt grouping

关于this问题,是否可以在xsl:key中使用变量?我想这样做:

<xsl:key name="ChargesKey" match="$ChargesForDisplay/charge" use="Name"/>

我正在使用带有ASP.Net的XSLT 1.0

2 个答案:

答案 0 :(得分:1)

我相信我可以放心地假设您指的是动态生成的节点集变量(与从源DOM中选择的那些变量相反,这是微不足道的),是的,可以在其上执行密钥匹配。动态生成的节点集变量的内容(正如我为this question演示的那样)。

假设你有一个这样的变量:

<xsl:variable name="ChargesForDisplay">
<charge>
   <Name>Name1</Name>
</charge>
<charge>
   <Name>Name2</Name>
</charge>
<charge>
   <Name>Name1</Name>
</charge>
<charge>
   <Name>Name3</Name>
</charge>
</xsl:variable>

您可以像这样定义键:

<xsl:key name="ChargesKey" match="charge" use="Name"/>

然后你就可以这样申请:

  <xsl:template match="/">
      <xsl:apply-templates select="msxsl:node-set($ChargesForDisplay)" />
  </xsl:template>

  <xsl:template
   match="charge[generate-id(.)=generate-id(key('ChargesKey',Name)[1])]">
    <xsl:variable name="matchingItems" select="key('ChargesKey', Name)" />
    ...
  </xsl:template>

当然,如果变量包含源XML DOM中的节点选择,那么它只是相同的方法,除了您不需要使用msxsl:node-set()

我怀疑在源XML文档中存在的节点名上有一个键或多个动态生成的节点集变量可能会导致分组产生意外结果(因为key()函数会从两者中找到节点变量和源文档)。出于这个原因,我建议在节点上定义键,这些键只存在于一个特定变量中,而不是其他地方。

答案 1 :(得分:1)

xsl:key的match属性必须是有效模式,而$ x / y不是有效模式。所以,答案是否定的。现在告诉我们您要实现的目标,我们可以帮助您实现目标。 (JLRishe做了一些疯狂的猜测,他/她称之为“疯狂的假设”,这可能是对的;但我不知道猜测的来源)。