Is it possible to use a variables inside xsl:key i

2019-07-27 11:08发布

问题:

Relating to this question, is it possible to use variables inside xsl:key? I want to do smth like this:

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

I'm using XSLT 1.0 with ASP.Net

回答1:

I believe I can safely assume that you are referring to dynamically-generated node-set variables (as opposed to those selected from the source DOM, which are trivial), and yes it is possible to perform a key-match on the contents of a dynamically generated node-set variable (as I demonstrate for this question).

Assuming you have a variable like this:

<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>

You would define the key like this:

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

And then you can apply it like this:

  <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>

Of course, if the variable contains a selection of nodes from the source XML DOM, then it's just the same approach, except you don't need to use msxsl:node-set().

I suspect that having a key on a node-name that's also present in the source XML document or multiple dynamically-generated node-set variables may cause grouping to produce unexpected results(because the key() function would locate nodes from both the variable and the source document). For this reason, I'd suggest defining keys on nodes that would only be present in one particular variable and nowhere else.



回答2:

The match attribute of xsl:key must be a valid pattern and $x/y is not a valid pattern. So, the answer is no. Now tell us what you are trying to achieve and we can help you achieve it. (JLRishe makes some wild guesses, which s/he calls "wild assumptions", and which may well be right; but I don't know where the guesses come from).