1

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

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

我在 ASP.Net 中使用 XSLT 1.0

4

2 回答 2

1

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

于 2013-01-18T22:55:49.653 回答
1

我相信我可以安全地假设您指的是动态生成的节点集变量(与从源 DOM 中选择的变量相反,这些变量是微不足道的),是的,可以对 a 的内容执行键匹配动态生成的节点集变量(正如我为这个问题演示的那样)。

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

<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() 函数会从变量和源文件)。出于这个原因,我建议在节点上定义只存在于一个特定变量中而不存在于其他任何地方的键。

于 2013-01-18T18:06:04.513 回答